From ed081923d7a6c811ac46ac6600d86441dabe6a2e Mon Sep 17 00:00:00 2001 From: Hombre Date: Fri, 1 Jun 2018 21:45:47 +0200 Subject: [PATCH 01/33] Bugfixing #4580 "RT 5.4 on Windows 8.1 x64 crashes while in editor" Wrong placement of Mutex protecting the CropHandler's pixbufs in cropwindow.cc + mixup between cropPixbuf & cropPixbuftrue --- rtengine/settings.h | 13 +++++++------ rtgui/crophandler.h | 4 ++-- rtgui/cropwindow.cc | 24 ++++++++++++------------ 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/rtengine/settings.h b/rtengine/settings.h index 639d3bf4a..f6edb7671 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -30,13 +30,13 @@ class Settings public: Glib::ustring iccDirectory; ///< The directory containing the possible output icc profiles int viewingdevice; // white of output device (D50...D65..) - int viewingdevicegrey; // level of grey output device + int viewingdevicegrey; // level of grey output device int viewinggreySc; // level of grey Scene - int leveldnv; // level of crop denoise - int leveldnti; // size of tiles denoise + int leveldnv; // level of crop denoise + int leveldnti; // size of tiles denoise int leveldnaut; // level of auto denoise int leveldnliss; // level of auto multi zone - int leveldnautsimpl; // STD or EXPERT + int leveldnautsimpl; // STD or EXPERT Glib::ustring printerProfile; ///< ICC profile name used for soft-proofing a printer output RenderingIntent printerIntent; ///< Colorimetric intent used with the above profile @@ -60,11 +60,12 @@ public: Glib::ustring bruce; // default name of Bruce Glib::ustring srgb; // default name of SRGB space profile Glib::ustring srgb10; // default name of SRGB space profile - Glib::ustring rec2020; // default name of rec2020 + Glib::ustring rec2020; // default name of rec2020 bool gamutICC; // no longer used bool gamutLch; - bool HistogramWorking; + bool HistogramWorking; // true: histogram is display the value of the image computed in the Working profile + // false: histogram is display the value of the image computed in the Output profile int amchroma; int protectred; double protectredh; diff --git a/rtgui/crophandler.h b/rtgui/crophandler.h index 17f2ca47d..305d15e2c 100644 --- a/rtgui/crophandler.h +++ b/rtgui/crophandler.h @@ -97,8 +97,8 @@ public: rtengine::procparams::CropParams cropParams; rtengine::procparams::ColorManagementParams colorParams; - Glib::RefPtr cropPixbuf; - Glib::RefPtr cropPixbuftrue; + Glib::RefPtr cropPixbuf; // image displayed on monitor, using the monitor profile (i.e. lab to monitor profile) + Glib::RefPtr cropPixbuftrue; // internal image in output color space for analysis (i.e. lab to either Working profile or Output profile, depending on options.rtSettings.HistogramWorking) MyMutex cimg; diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 08ea9d0f7..0e62e604e 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -1007,6 +1007,8 @@ void CropWindow::pointerMoved (int bstate, int x, int y) int mx, my; screenCoordToImage (x, y, mx, my); + MyMutex::MyLock lock(cropHandler.cimg); + if (!onArea (CropImage, x, y) || !cropHandler.cropPixbuf) { cropHandler.getFullImageSize(mx, my); // pmlistener->pointerMoved (false, cropHandler.colorParams.working, mx, my, -1, -1, -1); @@ -1023,7 +1025,7 @@ void CropWindow::pointerMoved (int bstate, int x, int y) } } else { - /*MyMutex::MyLock lock(cropHandler.cimg); + /* int vx = x - xpos - imgX; int vy = y - ypos - imgY; @@ -1033,7 +1035,6 @@ void CropWindow::pointerMoved (int bstate, int x, int y) */ - cropHandler.cimg.lock (); int vx = x - xpos - imgX; int vy = y - ypos - imgY; @@ -1045,9 +1046,9 @@ void CropWindow::pointerMoved (int bstate, int x, int y) // guint8* pix = cropHandler.cropPixbuf->get_pixels() + vy*cropHandler.cropPixbuf->get_rowstride() + vx*3; // if (vx < cropHandler.cropPixbuf->get_width() && vy < cropHandler.cropPixbuf->get_height()) // pmlistener->pointerMoved (true, mx, my, pix[0], pix[1], pix[2]); - int imwidth = cropHandler.cropPixbuf->get_width(); - int imheight = cropHandler.cropPixbuf->get_height(); - guint8* pix = cropHandler.cropPixbuftrue->get_pixels() + vy * cropHandler.cropPixbuf->get_rowstride() + vx * 3; + int imwidth = cropHandler.cropPixbuftrue->get_width(); + int imheight = cropHandler.cropPixbuftrue->get_height(); + guint8* pix = cropHandler.cropPixbuftrue->get_pixels() + vy * cropHandler.cropPixbuftrue->get_rowstride() + vx * 3; int rval = pix[0]; int gval = pix[1]; @@ -1062,17 +1063,16 @@ void CropWindow::pointerMoved (int bstate, int x, int y) isrc->getRawValues(mx, my, params.coarse.rotate, rval, gval, bval); } } - // pmlistener->pointerMoved (true, cropHandler.colorParams.working, mx, my, pix[0], pix[1], pix[2]); + + // Updates the Navigator + // TODO: possible double color conversion if rval, gval, bval come from cropHandler.cropPixbuftrue ? see issue #4583 pmlistener->pointerMoved (true, cropHandler.colorParams.output, cropHandler.colorParams.working, mx, my, rval, gval, bval); - if (pmhlistener) - // pmhlistener->pointerMoved (true, cropHandler.colorParams.working, mx, my, pix[0], pix[1], pix[2]); - { - pmhlistener->pointerMoved (true, cropHandler.colorParams.output, cropHandler.colorParams.working, mx, my, pix[0], pix[1], pix[2]); + if (pmhlistener) { + // Updates the HistogramRGBArea + pmhlistener->pointerMoved (true, cropHandler.colorParams.output, cropHandler.colorParams.working, mx, my, rval, gval, bval); } } - - cropHandler.cimg.unlock (); } } } From 6ae287b72b8072293de19437f71e7a5039321e19 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 26 Jul 2018 17:27:57 +0200 Subject: [PATCH 02/33] diagonalcurves: replace cubic splines with (centripetal) Catmull-Rom splines See https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline Fixes #4343 --- rtengine/curves.h | 1 + rtengine/diagonalcurves.cc | 165 ++++++++++++++++++++++++++++++++++--- 2 files changed, 155 insertions(+), 11 deletions(-) diff --git a/rtengine/curves.h b/rtengine/curves.h index 98934f13a..a9f4b4ace 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -444,6 +444,7 @@ protected: DiagonalCurveType kind; void spline_cubic_set (); + void catmull_rom_set(); void NURBS_set (); public: diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index a3b00b165..1e9c730d5 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -86,7 +86,8 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn) if (!identity) { if (kind == DCT_Spline && N > 2) { - spline_cubic_set (); + //spline_cubic_set (); + catmull_rom_set(); } else if (kind == DCT_NURBS && N > 2) { NURBS_set (); fillHash(); @@ -270,6 +271,134 @@ void DiagonalCurve::NURBS_set () fillDyByDx(); } + +/***************************************************************************** + * Catmull Rom Spline + * (https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline) + *****************************************************************************/ + +namespace { + +inline double pow2(double x) +{ + return x*x; +} + + +inline double catmull_rom_tj(double ti, + double xi, double yi, + double xj, double yj) +{ + return sqrt(sqrt(pow2(xj-xi) + pow2(yj-yi))) + ti; +} + + +inline void catmull_rom_spline(int n_points, + double p0_x, double p0_y, + double p1_x, double p1_y, + double p2_x, double p2_y, + double p3_x, double p3_y, + std::vector &res_x, + std::vector &res_y) +{ + res_x.reserve(n_points); + res_y.reserve(n_points); + + double t0 = 0; + double t1 = catmull_rom_tj(t0, p0_x, p0_y, p1_x, p1_y); + double t2 = catmull_rom_tj(t1, p1_x, p1_y, p2_x, p2_y); + double t3 = catmull_rom_tj(t2, p2_x, p2_y, p3_x, p3_y); + + double space = (t2-t1) / n_points; + + double t; + int i; + double c, d, A1_x, A1_y, A2_x, A2_y, A3_x, A3_y; + double B1_x, B1_y, B2_x, B2_y, C_x, C_y; + + for (i = 0; i < n_points; ++i) { + t = t1 + space * i; + + c = (t1 - t)/(t1 - t0); + d = (t - t0)/(t1 - t0); + A1_x = c * p0_x + d * p1_x; + A1_y = c * p0_y + d * p1_y; + + c = (t2 - t)/(t2 - t1); + d = (t - t1)/(t2 - t1); + A2_x = c * p1_x + d * p2_x; + A2_y = c * p1_y + d * p2_y; + + c = (t3 - t)/(t3 - t2); + d = (t - t2)/(t3 - t2); + A3_x = c * p2_x + d * p3_x; + A3_y = c * p2_y + d * p3_y; + + c = (t2 - t)/(t2 - t0); + d = (t - t0)/(t2 - t0); + B1_x = c * A1_x + d * A2_x; + B1_y = c * A1_y + d * A2_y; + + c = (t3 - t)/(t3 - t1); + d = (t - t1)/(t3 - t1); + B2_x = c * A2_x + d * A3_x; + B2_y = c * A2_y + d * A3_y; + + c = (t2 - t)/(t2 - t1); + d = (t - t1)/(t2 - t1); + C_x = c * B1_x + d * B2_x; + C_y = c * B1_y + d * B2_y; + + res_x.push_back(C_x); + res_y.push_back(C_y); + } +} + + +void catmull_rom_chain(int n_points, int n_cp, double *x, double *y, + std::vector &res_x, std::vector &res_y) +{ + static const double epsilon = 1e-5; + double xr = x[1] - x[0]; + double yr = y[1] - y[0]; + double x_first = x[0] - xr * 0.1; + double y_first = xr > epsilon ? (yr / xr) * (x_first - x[0]) + y[0] : y[0]; + xr = x[n_cp-1] - x[n_cp-2]; + yr = y[n_cp-1] - x[n_cp-2]; + double x_last = x[n_cp-1] + xr * 0.1; + double y_last = xr > epsilon ? (yr / xr) * (x_last - x[0]) + y[0] : y[0]; + + int segments = n_cp - 1; + int points_segments = n_points / segments; + + res_x.reserve(n_points); + res_y.reserve(n_points); + + for (int i = 0; i < segments; ++i) { + int n = points_segments + (i == 0 ? n_points % segments : 0); + catmull_rom_spline( + n, i == 0 ? x_first : x[i-1], i == 0 ? y_first : y[i-1], + x[i], y[i], x[i+1], y[i+1], + i == segments-1 ? x_last : x[i+2], + i == segments-1 ? y_last : y[i+2], + res_x, res_y); + } +} + +} // namespace + + +void DiagonalCurve::catmull_rom_set() +{ + int n_points = max(ppn * 65, 65000); + poly_x.clear(); + poly_y.clear(); + catmull_rom_chain(n_points, N, x, y, poly_x, poly_y); +} + +/*****************************************************************************/ + + double DiagonalCurve::getVal (double t) const { @@ -300,7 +429,8 @@ double DiagonalCurve::getVal (double t) const } case DCT_Linear : - case DCT_Spline : { + // case DCT_Spline : + { // values under and over the first and last point if (t > x[N - 1]) { return y[N - 1]; @@ -324,20 +454,33 @@ double DiagonalCurve::getVal (double t) const double h = x[k_hi] - x[k_lo]; // linear - if (kind == DCT_Linear) { + // if (kind == DCT_Linear) { return y[k_lo] + (t - x[k_lo]) * ( y[k_hi] - y[k_lo] ) / h; - } - // spline curve - else { // if (kind==Spline) { - double a = (x[k_hi] - t) / h; - double b = (t - x[k_lo]) / h; - double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666; - return CLIPD(r); - } + // } + // // spline curve + // else { // if (kind==Spline) { + // double a = (x[k_hi] - t) / h; + // double b = (t - x[k_lo]) / h; + // double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666; + // return CLIPD(r); + // } break; } + case DCT_Spline: { + auto it = std::lower_bound(poly_x.begin(), poly_x.end(), t); + if (it == poly_x.end()) { + return poly_y.back(); + } + auto d = it - poly_x.begin(); + if (it+1 < poly_x.end() && t - *it > *(it+1) - t) { + ++d; + } + return *(poly_y.begin() + d); + break; + } + case DCT_NURBS : { // get the hash table entry by rounding the value (previously multiplied by "hashSize") unsigned short int i = (unsigned short int)(t * hashSize); From 8be9a68212ced105f1a0c8eaf3fea10794d156e1 Mon Sep 17 00:00:00 2001 From: Hombre Date: Fri, 3 Aug 2018 07:13:47 +0200 Subject: [PATCH 03/33] Attempt to fix #4580 : "RT 5.4 on Windows 8.1 x64 crashes while in editor" Fixing an incorrect 'if' statment --- rtgui/cropwindow.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 3b8e715b9..77118277c 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -1009,7 +1009,7 @@ void CropWindow::pointerMoved (int bstate, int x, int y) MyMutex::MyLock lock(cropHandler.cimg); - if (!onArea (CropImage, x, y) || !cropHandler.cropPixbuf) { + if (!onArea (CropImage, x, y) || !cropHandler.cropPixbuftrue) { cropHandler.getFullImageSize(mx, my); // pmlistener->pointerMoved (false, cropHandler.colorParams.working, mx, my, -1, -1, -1); // if (pmhlistener) pmhlistener->pointerMoved (false, cropHandler.colorParams.working, mx, my, -1, -1, -1); From dc16368352854e38d84d4f1332d847f2a59a6128 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 7 Aug 2018 01:01:00 +0200 Subject: [PATCH 04/33] eahd_demosaic: double speed --- rtengine/demosaic_algos.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 78b5490b5..cc0b99beb 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -37,6 +37,7 @@ #include "sleef.c" #include "opthelper.h" #include "median.h" +#define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP #include @@ -50,7 +51,7 @@ namespace rtengine #undef DIST #define ABS(a) ((a)<0?-(a):(a)) -#define DIST(a,b) (ABS(a-b)) +#define DIST(a,b) (std::fabs(a-b)) #define CLIREF(x) LIM(x,-200000.0f,200000.0f) // avoid overflow : do not act directly on image[] or pix[] #define x1125(a) (a + xdivf(a, 3)) #define x0875(a) (a - xdivf(a, 3)) @@ -63,6 +64,7 @@ extern const Settings* settings; void RawImageSource::eahd_demosaic () { + BENCHFUN if (plistener) { plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD))); plistener->setProgress (0.0); From 2bb27661a2802f9dfefe12e94afc5c8f5e5103b0 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 10 Aug 2018 08:05:41 +0200 Subject: [PATCH 05/33] various tweaks to catmull-rom --- rtengine/diagonalcurves.cc | 12 +++--- rtengine/histmatching.cc | 79 ++++++++++++++++++++++++++++++++++---- 2 files changed, 79 insertions(+), 12 deletions(-) diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index 1e9c730d5..23c1fba47 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -359,12 +359,14 @@ void catmull_rom_chain(int n_points, int n_cp, double *x, double *y, std::vector &res_x, std::vector &res_y) { static const double epsilon = 1e-5; - double xr = x[1] - x[0]; - double yr = y[1] - y[0]; + // double xr = x[1] - x[0]; + // double yr = y[1] - y[0]; + double xr = x[n_cp-1] - x[0]; + double yr = y[n_cp-1] - y[0]; double x_first = x[0] - xr * 0.1; double y_first = xr > epsilon ? (yr / xr) * (x_first - x[0]) + y[0] : y[0]; - xr = x[n_cp-1] - x[n_cp-2]; - yr = y[n_cp-1] - x[n_cp-2]; + // xr = x[n_cp-1] - x[n_cp-2]; + // yr = y[n_cp-1] - x[n_cp-2]; double x_last = x[n_cp-1] + xr * 0.1; double y_last = xr > epsilon ? (yr / xr) * (x_last - x[0]) + y[0] : y[0]; @@ -477,7 +479,7 @@ double DiagonalCurve::getVal (double t) const if (it+1 < poly_x.end() && t - *it > *(it+1) - t) { ++d; } - return *(poly_y.begin() + d); + return LIM01(*(poly_y.begin() + d)); break; } diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 2dfcc6d3b..184152ac8 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -97,6 +97,55 @@ int findMatch(int val, const std::vector &cdf, int j) } +class CubicSplineCurve: public DiagonalCurve { +public: + CubicSplineCurve(const std::vector &points): + DiagonalCurve({DCT_Linear}) + { + N = points.size() / 2; + x = new double[N]; + y = new double[N]; + + for (int i = 0; i < N; ++i) { + x[i] = points[2*i]; + y[i] = points[2*i+1]; + } + kind = DCT_Spline; + spline_cubic_set(); + } + + double getVal(double t) const + { + // values under and over the first and last point + if (t > x[N - 1]) { + return y[N - 1]; + } else if (t < x[0]) { + return y[0]; + } + + // do a binary search for the right interval: + unsigned int k_lo = 0, k_hi = N - 1; + + while (k_hi > 1 + k_lo) { + unsigned int k = (k_hi + k_lo) / 2; + + if (x[k] > t) { + k_hi = k; + } else { + k_lo = k; + } + } + + double h = x[k_hi] - x[k_lo]; + + double a = (x[k_hi] - t) / h; + double b = (t - x[k_lo]) / h; + double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666; + return LIM01(r); + } +}; + + void mappingToCurve(const std::vector &mapping, std::vector &curve) { curve.clear(); @@ -117,8 +166,9 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) auto coord = [](int v) -> double { return double(v)/255.0; }; auto doit = - [&](int start, int stop, int step, bool addstart) -> void + [&](int start, int stop, int step, bool addstart, int maxdelta=0) -> void { + if (!maxdelta) maxdelta = step * 2; int prev = start; if (addstart && mapping[start] >= 0) { curve.push_back(coord(start)); @@ -131,7 +181,7 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) } bool change = i > 0 && v != mapping[i-1]; int diff = i - prev; - if ((change && std::abs(diff - step) <= 1) || diff > step * 2) { + if ((change && std::abs(diff - step) <= 1) || diff > maxdelta) { curve.push_back(coord(i)); curve.push_back(coord(v)); prev = i; @@ -152,23 +202,38 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) int end = mapping.size(); if (idx <= end / 3) { doit(start, idx, idx / 2, true); - doit(idx, end, (end - idx) / 3, false); + step = (end - idx) / 4; + doit(idx, end, step, false, step); } else { doit(start, idx, idx > step ? step : idx / 2, true); - doit(idx, int(mapping.size()), step, idx - step > step / 2 && std::abs(curve[curve.size()-2] - coord(idx)) > 0.01); + doit(idx, end, step, idx - step > step / 2 && std::abs(curve[curve.size()-2] - coord(idx)) > 0.01); } - if (curve.size() > 2 && (1 - curve[curve.size()-2] <= step / (256.0 * 3))) { + if (curve.size() > 2 && (1 - curve[curve.size()-2] <= coord(step) / 3)) { curve.pop_back(); curve.pop_back(); } - + curve.push_back(1.0); curve.push_back(1.0); if (curve.size() < 4) { curve = { DCT_Linear }; // not enough points, fall back to linear } else { + CubicSplineCurve c(curve); + curve.pop_back(); + curve.pop_back(); + double gap = coord(step); + while (1 - curve[curve.size()-2] > gap) { + double x = curve[curve.size()-2] + gap; + if (1 - x <= gap / 3) { + break; + } + curve.push_back(x); + curve.push_back(c.getVal(x)); + } + curve.push_back(1.0); + curve.push_back(1.0); curve.insert(curve.begin(), DCT_Spline); } } @@ -220,7 +285,7 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st neutral.icm = cp; neutral.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); neutral.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); - neutral.icm.outputProfile = "sRGB"; + neutral.icm.outputProfile = ColorManagementParams::NoICMString; std::unique_ptr source; { From 5bfc5dd880fc652ab5a977b878263f8c7b3edb76 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 11 Aug 2018 21:53:49 +0200 Subject: [PATCH 06/33] EAHD demosaic: further speedup, #4727 --- rtengine/demosaic_algos.cc | 84 +++++++------- rtengine/rawimagesource.h | 6 +- rtengine/rawimagesource_i.h | 216 ++++++++++++++++-------------------- 3 files changed, 144 insertions(+), 162 deletions(-) diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index cc0b99beb..7d5c74264 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -85,8 +85,8 @@ void RawImageSource::eahd_demosaic () lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; int maxindex = 3 * 65536; //2*65536 3 = avoid crash 3/2013 J.Desmis - cache = new double[maxindex]; - threshold = (int)(0.008856 * MAXVALD); + cache = new float[maxindex]; + threshold = 0.008856 * MAXVALD; for (int i = 0; i < maxindex; i++) { cache[i] = std::cbrt(double(i) / MAXVALD); @@ -98,8 +98,8 @@ void RawImageSource::eahd_demosaic () rh (W, 3), gh (W, 4), bh (W, 3), rv (W, 3), gv (W, 4), bv (W, 3), lLh (W, 3), lah (W, 3), lbh (W, 3), - lLv (W, 3), lav (W, 3), lbv (W, 3), - homh (W, 3), homv (W, 3); + lLv (W, 3), lav (W, 3), lbv (W, 3); + JaggedArray homh (W, 3), homv (W, 3); // interpolate first two lines interpolate_row_g (gh[0], gv[0], 0); @@ -122,14 +122,15 @@ void RawImageSource::eahd_demosaic () homv[1][j] = 0; } - int dLmaph[9]; - int dLmapv[9]; - int dCamaph[9]; - int dCamapv[9]; - int dCbmaph[9]; - int dCbmapv[9]; + float dLmaph[9]; + float dLmapv[9]; + float dCamaph[9]; + float dCamapv[9]; + float dCbmaph[9]; + float dCbmapv[9]; for (int i = 1; i < H - 1; i++) { + int mod[3] = {(i-1) % 3, i % 3, (i+1) %3}; int ix = i % 3; int imx = (i - 1) % 3; int ipx = (i + 1) % 3; @@ -151,19 +152,16 @@ void RawImageSource::eahd_demosaic () homv[ipx][j] = 0; } - int sh, sv, idx; - for (int j = 1; j < W - 1; j++) { int dmi = 0; - - for (int x = -1; x <= 1; x++) { - idx = (i + x) % 3; + for (int x = -1; x <= 0; x++) { + int idx = mod[x + 1]; for (int y = -1; y <= 1; y++) { // compute distance in a, b, and L if (dmi < 4) { - sh = homh[idx][j + y]; - sv = homv[idx][j + y]; + int sh = homh[idx][j + y]; + int sv = homv[idx][j + y]; if (sh > sv) { // fixate horizontal pixel dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); @@ -199,25 +197,29 @@ void RawImageSource::eahd_demosaic () dmi++; } } + int idx = mod[2]; + + for (int y = -1; y <= 1; y++) { + // compute distance in a, b, and L + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + dmi++; + } // compute eL & eC - int eL = min(max(dLmaph[3], dLmaph[5]), max(dLmapv[1], dLmapv[7])); - int eCa = min(max(dCamaph[3], dCamaph[5]), max(dCamapv[1], dCamapv[7])); - int eCb = min(max(dCbmaph[3], dCbmaph[5]), max(dCbmapv[1], dCbmapv[7])); + float eL = min(max(dLmaph[3], dLmaph[5]), max(dLmapv[1], dLmapv[7])); + float eCa = min(max(dCamaph[3], dCamaph[5]), max(dCamapv[1], dCamapv[7])); + float eCb = min(max(dCbmaph[3], dCbmaph[5]), max(dCbmapv[1], dCbmapv[7])); int wh = 0; - for (int dmi = 0; dmi < 9; dmi++) - if (dLmaph[dmi] <= eL && dCamaph[dmi] <= eCa && dCbmaph[dmi] <= eCb) { - wh++; - } - - int wv = 0; - - for (int dmi = 0; dmi < 9; dmi++) - if (dLmapv[dmi] <= eL && dCamapv[dmi] <= eCa && dCbmapv[dmi] <= eCb) { - wv++; - } + for (int dmi = 0; dmi < 9; dmi++) { + wh += (dLmaph[dmi] <= eL) * (dCamaph[dmi] <= eCa) * (dCbmaph[dmi] <= eCb); + } homh[imx][j - 1] += wh; homh[imx][j] += wh; @@ -229,6 +231,12 @@ void RawImageSource::eahd_demosaic () homh[ipx][j] += wh; homh[ipx][j + 1] += wh; + int wv = 0; + + for (int dmi = 0; dmi < 9; dmi++) { + wv += (dLmapv[dmi] <= eL) * (dCamapv[dmi] <= eCa) * (dCbmapv[dmi] <= eCb); + } + homv[imx][j - 1] += wv; homv[imx][j] += wv; homv[imx][j + 1] += wv; @@ -240,16 +248,13 @@ void RawImageSource::eahd_demosaic () homv[ipx][j + 1] += wv; } -//} // finalize image - int hc, vc; - for (int j = 0; j < W; j++) { if (ri->ISGREEN(i - 1, j)) { green[i - 1][j] = rawData[i - 1][j]; } else { - hc = homh[imx][j]; - vc = homv[imx][j]; + int hc = homh[imx][j]; + int vc = homv[imx][j]; if (hc > vc) { green[i - 1][j] = gh[(i - 1) % 4][j]; @@ -267,12 +272,10 @@ void RawImageSource::eahd_demosaic () } // finish H-2th and H-1th row, homogenity value is still valailable - int hc, vc; - for (int i = H - 1; i < H + 1; i++) for (int j = 0; j < W; j++) { - hc = homh[(i - 1) % 3][j]; - vc = homv[(i - 1) % 3][j]; + int hc = homh[(i - 1) % 3][j]; + int vc = homv[(i - 1) % 3][j]; if (hc > vc) { green[i - 1][j] = gh[(i - 1) % 4][j]; @@ -284,6 +287,7 @@ void RawImageSource::eahd_demosaic () } // Interpolate R and B + #pragma omp parallel for for (int i = 0; i < H; i++) { if (i == 0) { interpolate_row_rb_mul_pp (rawData, red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 53d3e0dc1..0c335b4ab 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -76,9 +76,9 @@ protected: unsigned int numFrames = 0; // to accelerate CIELAB conversion: - double lc00, lc01, lc02, lc10, lc11, lc12, lc20, lc21, lc22; - double* cache; - int threshold; + float lc00, lc01, lc02, lc10, lc11, lc12, lc20, lc21, lc22; + float* cache; + float threshold; array2D rawData; // holds preprocessed pixel values, rowData[i][j] corresponds to the ith row and jth column array2D *rawDataFrames[4] = {nullptr}; diff --git a/rtengine/rawimagesource_i.h b/rtengine/rawimagesource_i.h index 91d62ecab..fb85e4933 100644 --- a/rtengine/rawimagesource_i.h +++ b/rtengine/rawimagesource_i.h @@ -62,22 +62,22 @@ inline void RawImageSource::convert_to_cielab_row (float* ar, float* ag, float* { for (int j = 0; j < W; j++) { - double r = ar[j]; - double g = ag[j]; - double b = ab[j]; + float r = ar[j]; + float g = ag[j]; + float b = ab[j]; - double x = lc00 * r + lc01 * g + lc02 * b; - double y = lc10 * r + lc11 * g + lc12 * b; - double z = lc20 * r + lc21 * g + lc22 * b; + float x = lc00 * r + lc01 * g + lc02 * b; + float y = lc10 * r + lc11 * g + lc12 * b; + float z = lc20 * r + lc21 * g + lc22 * b; if (y > threshold) { oL[j] = cache[(int)y]; } else { - oL[j] = float(903.3 * y / MAXVALD); + oL[j] = float(903.3f * y / MAXVALF); } - oa[j] = float(500.0 * ((x > threshold ? cache[(int)x] : 7.787 * x / MAXVALD + 16.0 / 116.0) - (y > threshold ? cache[(int)y] : 7.787 * y / MAXVALD + 16.0 / 116.0))); - ob[j] = float(200.0 * ((y > threshold ? cache[(int)y] : 7.787 * y / MAXVALD + 16.0 / 116.0) - (z > threshold ? cache[(int)z] : 7.787 * z / MAXVALD + 16.0 / 116.0))); + oa[j] = 500.f * ((x > threshold ? cache[(int)x] : 7.787f * x / MAXVALF + 16.f / 116.f) - (y > threshold ? cache[(int)y] : 7.787f * y / MAXVALF + 16.f / 116.f)); + ob[j] = 200.f * ((y > threshold ? cache[(int)y] : 7.787f * y / MAXVALF + 16.f / 116.f) - (z > threshold ? cache[(int)z] : 7.787f * z / MAXVALF + 16.f / 116.f)); } } @@ -154,125 +154,103 @@ inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, : 0.f; }; - if ((ri->ISRED(i, 0) || ri->ISRED(i, 1))) { - // RGRGR or GRGRGR line - for (int j = 0; j < W; j++) { - if (ri->ISRED(i, j)) { - // red is simple - ar[j] = rawData[i][j]; - // blue: cross interpolation - int b = 0; - int n = 0; + float *nonGreen1 = ar; + float *nonGreen2 = ab; - if (i > 0 && j > 0) { - b += rawData[i - 1][j - 1] - getPg(j - 1); - n++; - } + if ((ri->ISBLUE(i, 0) || ri->ISBLUE(i, 1))) { + std::swap(nonGreen1, nonGreen2); + } + int j = FC(i, 0) & 1; + if (j) { + // linear R-G interp. horizontally + float val1; - if (i > 0 && j < W - 1) { - b += rawData[i - 1][j + 1] - getPg(j + 1); - n++; - } + val1 = cg[0] + rawData[i][1] - cg[1]; - if (i < H - 1 && j > 0) { - b += rawData[i + 1][j - 1] - getNg(j - 1); - n++; - } + nonGreen1[0] = CLIP(val1); + // linear B-G interp. vertically + float val2; - if (i < H - 1 && j < W - 1) { - b += rawData[i + 1][j + 1] - getNg(j + 1); - n++; - } - - b = cg[j] + b / std::max(1, n); - ab[j] = b; - } else { - // linear R-G interp. horizontally - int r; - - if (j == 0) { - r = cg[0] + rawData[i][1] - cg[1]; - } else if (j == W - 1) { - r = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; - } else { - r = cg[j] + (rawData[i][j - 1] - cg[j - 1] + rawData[i][j + 1] - cg[j + 1]) / 2; - } - - ar[j] = CLIP(r); - // linear B-G interp. vertically - int b; - - if (i == 0) { - b = getNg(j) + rawData[1][j] - cg[j]; - } else if (i == H - 1) { - b = getPg(j) + rawData[H - 2][j] - cg[j]; - } else { - b = cg[j] + (rawData[i - 1][j] - getPg(j) + rawData[i + 1][j] - getNg(j)) / 2; - } - - ab[j] = b; - } + if (i == 0) { + val2 = getNg(0) + rawData[1][0] - cg[0]; + } else if (i == H - 1) { + val2 = getPg(0) + rawData[H - 2][0] - cg[0]; + } else { + val2 = cg[0] + (rawData[i - 1][0] - getPg(0) + rawData[i + 1][0] - getNg(0)) / 2; } - } else { - // BGBGB or GBGBGB line - for (int j = 0; j < W; j++) { - if (ri->ISBLUE(i, j)) { - // red is simple - ab[j] = rawData[i][j]; - // blue: cross interpolation - int r = 0; - int n = 0; - if (i > 0 && j > 0) { - r += rawData[i - 1][j - 1] - getPg(j - 1); - n++; - } + nonGreen2[0] = val2; + } + // RGRGR or GRGRGR line + for (; j < W - 1; j += 2) { + // nonGreen of row is simple + nonGreen1[j] = rawData[i][j]; + // non green of next row: cross interpolation + float nonGreen = 0.f; + int n = 0; - if (i > 0 && j < W - 1) { - r += rawData[i - 1][j + 1] - getPg(j + 1); - n++; - } - - if (i < H - 1 && j > 0) { - r += rawData[i + 1][j - 1] - getNg(j - 1); - n++; - } - - if (i < H - 1 && j < W - 1) { - r += rawData[i + 1][j + 1] - getNg(j + 1); - n++; - } - - r = cg[j] + r / std::max(n, 1); - - ar[j] = r; - } else { - // linear B-G interp. horizontally - int b; - - if (j == 0) { - b = cg[0] + rawData[i][1] - cg[1]; - } else if (j == W - 1) { - b = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; - } else { - b = cg[j] + (rawData[i][j - 1] - cg[j - 1] + rawData[i][j + 1] - cg[j + 1]) / 2; - } - - ab[j] = CLIP(b); - // linear R-G interp. vertically - int r; - - if (i == 0) { - r = getNg(j) + rawData[1][j] - cg[j]; - } else if (i == H - 1) { - r = getPg(j) + rawData[H - 2][j] - cg[j]; - } else { - r = cg[j] + (rawData[i - 1][j] - getPg(j) + rawData[i + 1][j] - getNg(j)) / 2; - } - - ar[j] = r; + if (i > 0) { + if (j > 0) { + nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); + n++; } + nonGreen += rawData[i - 1][j + 1] - getPg(j + 1); + n++; } + + if (i < H - 1) { + if (j > 0) { + nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); + n++; + } + nonGreen += rawData[i + 1][j + 1] - getNg(j + 1); + n++; + } + + nonGreen2[j] = cg[j] + nonGreen / n; + + // linear R-G interp. horizontally + float val1; + + if (j == W - 2) { + val1 = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; + } else { + val1 = cg[j + 1] + (rawData[i][j] - cg[j] + rawData[i][j + 2] - cg[j + 2]) / 2; + } + + nonGreen1[j + 1] = CLIP(val1); + // linear B-G interp. vertically + float val2; + + if (i == 0) { + val2 = getNg(j + 1) + rawData[1][j + 1] - cg[j + 1]; + } else if (i == H - 1) { + val2 = getPg(j + 1) + rawData[H - 2][j + 1] - cg[j + 1]; + } else { + val2 = cg[j + 1] + (rawData[i - 1][j + 1] - getPg(j + 1) + rawData[i + 1][j + 1] - getNg(j + 1)) / 2; + } + + nonGreen2[j + 1] = val2; + } + + if(j == W - 1) { + // nonGreen of row is simple + nonGreen1[j] = rawData[i][j]; + // non green of next row: cross interpolation + float nonGreen = 0.f; + int n = 0; + + if (i > 0) { + nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); + n++; + } + + if (i < H - 1) { + nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); + n++; + } + + nonGreen2[j] = cg[j] + nonGreen / n; } } From 46d4810b68a57d511b660ebcfef3a18a4a77d2bc Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 11 Aug 2018 23:30:36 +0200 Subject: [PATCH 07/33] EAHD demosaic: own compilation unit, #4727 --- rtengine/CMakeLists.txt | 1 + rtengine/demosaic_algos.cc | 247 +------------------------------- rtengine/eahd_demosaic.cc | 280 +++++++++++++++++++++++++++++++++++++ 3 files changed, 284 insertions(+), 244 deletions(-) create mode 100644 rtengine/eahd_demosaic.cc diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 74497d7d0..3cbfed183 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -55,6 +55,7 @@ set(RTENGINESOURCEFILES dirpyr_equalizer.cc dual_demosaic_RT.cc dynamicprofile.cc + eahd_demosaic.cc expo_before_b.cc fast_demo.cc ffmanager.cc diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 7d5c74264..c0d0c2a2b 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -47,11 +47,12 @@ using namespace std; namespace rtengine { + +extern const Settings* settings; + #undef ABS -#undef DIST #define ABS(a) ((a)<0?-(a):(a)) -#define DIST(a,b) (std::fabs(a-b)) #define CLIREF(x) LIM(x,-200000.0f,200000.0f) // avoid overflow : do not act directly on image[] or pix[] #define x1125(a) (a + xdivf(a, 3)) #define x0875(a) (a - xdivf(a, 3)) @@ -59,248 +60,6 @@ namespace rtengine #define x00625(a) xdivf(a, 4) #define x0125(a) xdivf(a, 3) -extern const Settings* settings; -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void RawImageSource::eahd_demosaic () -{ - BENCHFUN - if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD))); - plistener->setProgress (0.0); - } - - // prepare cache and constants for cielab conversion - //TODO: revisit after conversion to D50 illuminant - lc00 = (0.412453 * imatrices.rgb_cam[0][0] + 0.357580 * imatrices.rgb_cam[0][1] + 0.180423 * imatrices.rgb_cam[0][2]) ;// / 0.950456; - lc01 = (0.412453 * imatrices.rgb_cam[1][0] + 0.357580 * imatrices.rgb_cam[1][1] + 0.180423 * imatrices.rgb_cam[1][2]) ;// / 0.950456; - lc02 = (0.412453 * imatrices.rgb_cam[2][0] + 0.357580 * imatrices.rgb_cam[2][1] + 0.180423 * imatrices.rgb_cam[2][2]) ;// / 0.950456; - - lc10 = 0.212671 * imatrices.rgb_cam[0][0] + 0.715160 * imatrices.rgb_cam[0][1] + 0.072169 * imatrices.rgb_cam[0][2]; - lc11 = 0.212671 * imatrices.rgb_cam[1][0] + 0.715160 * imatrices.rgb_cam[1][1] + 0.072169 * imatrices.rgb_cam[1][2]; - lc12 = 0.212671 * imatrices.rgb_cam[2][0] + 0.715160 * imatrices.rgb_cam[2][1] + 0.072169 * imatrices.rgb_cam[2][2]; - - lc20 = (0.019334 * imatrices.rgb_cam[0][0] + 0.119193 * imatrices.rgb_cam[0][1] + 0.950227 * imatrices.rgb_cam[0][2]) ;// / 1.088754; - lc21 = (0.019334 * imatrices.rgb_cam[1][0] + 0.119193 * imatrices.rgb_cam[1][1] + 0.950227 * imatrices.rgb_cam[1][2]) ;// / 1.088754; - lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; - - int maxindex = 3 * 65536; //2*65536 3 = avoid crash 3/2013 J.Desmis - cache = new float[maxindex]; - threshold = 0.008856 * MAXVALD; - - for (int i = 0; i < maxindex; i++) { - cache[i] = std::cbrt(double(i) / MAXVALD); - } - - // end of cielab preparation - - JaggedArray - rh (W, 3), gh (W, 4), bh (W, 3), - rv (W, 3), gv (W, 4), bv (W, 3), - lLh (W, 3), lah (W, 3), lbh (W, 3), - lLv (W, 3), lav (W, 3), lbv (W, 3); - JaggedArray homh (W, 3), homv (W, 3); - - // interpolate first two lines - interpolate_row_g (gh[0], gv[0], 0); - interpolate_row_g (gh[1], gv[1], 1); - interpolate_row_g (gh[2], gv[2], 2); - interpolate_row_rb (rh[0], bh[0], nullptr, gh[0], gh[1], 0); - interpolate_row_rb (rv[0], bv[0], nullptr, gv[0], gv[1], 0); - interpolate_row_rb (rh[1], bh[1], gh[0], gh[1], gh[2], 1); - interpolate_row_rb (rv[1], bv[1], gv[0], gv[1], gv[2], 1); - - convert_to_cielab_row (rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0]); - convert_to_cielab_row (rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0]); - convert_to_cielab_row (rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1]); - convert_to_cielab_row (rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1]); - - for (int j = 0; j < W; j++) { - homh[0][j] = 0; - homv[0][j] = 0; - homh[1][j] = 0; - homv[1][j] = 0; - } - - float dLmaph[9]; - float dLmapv[9]; - float dCamaph[9]; - float dCamapv[9]; - float dCbmaph[9]; - float dCbmapv[9]; - - for (int i = 1; i < H - 1; i++) { - int mod[3] = {(i-1) % 3, i % 3, (i+1) %3}; - int ix = i % 3; - int imx = (i - 1) % 3; - int ipx = (i + 1) % 3; - - if (i < H - 2) { - interpolate_row_g (gh[(i + 2) % 4], gv[(i + 2) % 4], i + 2); - interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], gh[(i + 2) % 4], i + 1); - interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], gv[(i + 2) % 4], i + 1); - } else { - interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], nullptr, i + 1); - interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], nullptr, i + 1); - } - - convert_to_cielab_row (rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3]); - convert_to_cielab_row (rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3]); - - for (int j = 0; j < W; j++) { - homh[ipx][j] = 0; - homv[ipx][j] = 0; - } - - for (int j = 1; j < W - 1; j++) { - int dmi = 0; - for (int x = -1; x <= 0; x++) { - int idx = mod[x + 1]; - - for (int y = -1; y <= 1; y++) { - // compute distance in a, b, and L - if (dmi < 4) { - int sh = homh[idx][j + y]; - int sv = homv[idx][j + y]; - - if (sh > sv) { // fixate horizontal pixel - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLh[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lah[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbh[idx][j + y]); - } else if (sh < sv) { - dLmaph[dmi] = DIST(lLh[ix][j], lLv[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lav[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbv[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - } else { - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - } - } else { - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - } - - dmi++; - } - } - int idx = mod[2]; - - for (int y = -1; y <= 1; y++) { - // compute distance in a, b, and L - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - dmi++; - } - - // compute eL & eC - float eL = min(max(dLmaph[3], dLmaph[5]), max(dLmapv[1], dLmapv[7])); - float eCa = min(max(dCamaph[3], dCamaph[5]), max(dCamapv[1], dCamapv[7])); - float eCb = min(max(dCbmaph[3], dCbmaph[5]), max(dCbmapv[1], dCbmapv[7])); - - int wh = 0; - - for (int dmi = 0; dmi < 9; dmi++) { - wh += (dLmaph[dmi] <= eL) * (dCamaph[dmi] <= eCa) * (dCbmaph[dmi] <= eCb); - } - - homh[imx][j - 1] += wh; - homh[imx][j] += wh; - homh[imx][j + 1] += wh; - homh[ix][j - 1] += wh; - homh[ix][j] += wh; - homh[ix][j + 1] += wh; - homh[ipx][j - 1] += wh; - homh[ipx][j] += wh; - homh[ipx][j + 1] += wh; - - int wv = 0; - - for (int dmi = 0; dmi < 9; dmi++) { - wv += (dLmapv[dmi] <= eL) * (dCamapv[dmi] <= eCa) * (dCbmapv[dmi] <= eCb); - } - - homv[imx][j - 1] += wv; - homv[imx][j] += wv; - homv[imx][j + 1] += wv; - homv[ix][j - 1] += wv; - homv[ix][j] += wv; - homv[ix][j + 1] += wv; - homv[ipx][j - 1] += wv; - homv[ipx][j] += wv; - homv[ipx][j + 1] += wv; - } - - // finalize image - for (int j = 0; j < W; j++) { - if (ri->ISGREEN(i - 1, j)) { - green[i - 1][j] = rawData[i - 1][j]; - } else { - int hc = homh[imx][j]; - int vc = homv[imx][j]; - - if (hc > vc) { - green[i - 1][j] = gh[(i - 1) % 4][j]; - } else if (hc < vc) { - green[i - 1][j] = gv[(i - 1) % 4][j]; - } else { - green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; - } - } - } - - if (!(i % 20) && plistener) { - plistener->setProgress ((double)i / (H - 2)); - } - } - - // finish H-2th and H-1th row, homogenity value is still valailable - for (int i = H - 1; i < H + 1; i++) - for (int j = 0; j < W; j++) { - int hc = homh[(i - 1) % 3][j]; - int vc = homv[(i - 1) % 3][j]; - - if (hc > vc) { - green[i - 1][j] = gh[(i - 1) % 4][j]; - } else if (hc < vc) { - green[i - 1][j] = gv[(i - 1) % 4][j]; - } else { - green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; - } - } - - // Interpolate R and B - #pragma omp parallel for - for (int i = 0; i < H; i++) { - if (i == 0) { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } else if (i == H - 1) { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); - } else { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } - } -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - void RawImageSource::hphd_vertical (float** hpmap, int col_from, int col_to) { float* temp = new float[max(W, H)]; diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc new file mode 100644 index 000000000..62eee47a4 --- /dev/null +++ b/rtengine/eahd_demosaic.cc @@ -0,0 +1,280 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2018 Gabor Horvath and other RawTherapee contributors + * Split out to own compilation unit and made speedup 2018 Ingo Weyrich (heckflosse67@gmx.de) + * + * 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 . + */ +#include + +#include "rawimagesource.h" +#include "rawimagesource_i.h" +#include "jaggedarray.h" +#include "rawimage.h" +#include "iccmatrices.h" +#include "rt_math.h" +#include "../rtgui/multilangmgr.h" +#include "procparams.h" +#define BENCHMARK +#include "StopWatch.h" + +using namespace std; + +namespace rtengine +{ + +#define DIST(a,b) (std::fabs(a-b)) + +extern const Settings* settings; +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void RawImageSource::eahd_demosaic () +{ + BENCHFUN + if (plistener) { + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD))); + plistener->setProgress (0.0); + } + + // prepare cache and constants for cielab conversion + //TODO: revisit after conversion to D50 illuminant + lc00 = (0.412453 * imatrices.rgb_cam[0][0] + 0.357580 * imatrices.rgb_cam[0][1] + 0.180423 * imatrices.rgb_cam[0][2]) ;// / 0.950456; + lc01 = (0.412453 * imatrices.rgb_cam[1][0] + 0.357580 * imatrices.rgb_cam[1][1] + 0.180423 * imatrices.rgb_cam[1][2]) ;// / 0.950456; + lc02 = (0.412453 * imatrices.rgb_cam[2][0] + 0.357580 * imatrices.rgb_cam[2][1] + 0.180423 * imatrices.rgb_cam[2][2]) ;// / 0.950456; + + lc10 = 0.212671 * imatrices.rgb_cam[0][0] + 0.715160 * imatrices.rgb_cam[0][1] + 0.072169 * imatrices.rgb_cam[0][2]; + lc11 = 0.212671 * imatrices.rgb_cam[1][0] + 0.715160 * imatrices.rgb_cam[1][1] + 0.072169 * imatrices.rgb_cam[1][2]; + lc12 = 0.212671 * imatrices.rgb_cam[2][0] + 0.715160 * imatrices.rgb_cam[2][1] + 0.072169 * imatrices.rgb_cam[2][2]; + + lc20 = (0.019334 * imatrices.rgb_cam[0][0] + 0.119193 * imatrices.rgb_cam[0][1] + 0.950227 * imatrices.rgb_cam[0][2]) ;// / 1.088754; + lc21 = (0.019334 * imatrices.rgb_cam[1][0] + 0.119193 * imatrices.rgb_cam[1][1] + 0.950227 * imatrices.rgb_cam[1][2]) ;// / 1.088754; + lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; + + int maxindex = 3 * 65536; //2*65536 3 = avoid crash 3/2013 J.Desmis + cache = new float[maxindex]; + threshold = 0.008856 * MAXVALD; + + for (int i = 0; i < maxindex; i++) { + cache[i] = std::cbrt(double(i) / MAXVALD); + } + + // end of cielab preparation + + JaggedArray + rh (W, 3), gh (W, 4), bh (W, 3), + rv (W, 3), gv (W, 4), bv (W, 3), + lLh (W, 3), lah (W, 3), lbh (W, 3), + lLv (W, 3), lav (W, 3), lbv (W, 3); + JaggedArray homh (W, 3), homv (W, 3); + + // interpolate first two lines + interpolate_row_g (gh[0], gv[0], 0); + interpolate_row_g (gh[1], gv[1], 1); + interpolate_row_g (gh[2], gv[2], 2); + interpolate_row_rb (rh[0], bh[0], nullptr, gh[0], gh[1], 0); + interpolate_row_rb (rv[0], bv[0], nullptr, gv[0], gv[1], 0); + interpolate_row_rb (rh[1], bh[1], gh[0], gh[1], gh[2], 1); + interpolate_row_rb (rv[1], bv[1], gv[0], gv[1], gv[2], 1); + + convert_to_cielab_row (rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0]); + convert_to_cielab_row (rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0]); + convert_to_cielab_row (rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1]); + convert_to_cielab_row (rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1]); + + for (int j = 0; j < W; j++) { + homh[0][j] = 0; + homv[0][j] = 0; + homh[1][j] = 0; + homv[1][j] = 0; + } + + float dLmaph[9]; + float dLmapv[9]; + float dCamaph[9]; + float dCamapv[9]; + float dCbmaph[9]; + float dCbmapv[9]; + + for (int i = 1; i < H - 1; i++) { + int mod[3] = {(i-1) % 3, i % 3, (i+1) %3}; + int ix = i % 3; + int imx = (i - 1) % 3; + int ipx = (i + 1) % 3; + + if (i < H - 2) { + interpolate_row_g (gh[(i + 2) % 4], gv[(i + 2) % 4], i + 2); + interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], gh[(i + 2) % 4], i + 1); + interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], gv[(i + 2) % 4], i + 1); + } else { + interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], nullptr, i + 1); + interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], nullptr, i + 1); + } + + convert_to_cielab_row (rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3]); + convert_to_cielab_row (rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3]); + + for (int j = 0; j < W; j++) { + homh[ipx][j] = 0; + homv[ipx][j] = 0; + } + + for (int j = 1; j < W - 1; j++) { + int dmi = 0; + for (int x = -1; x <= 0; x++) { + int idx = mod[x + 1]; + + for (int y = -1; y <= 1; y++) { + // compute distance in a, b, and L + if (dmi < 4) { + int sh = homh[idx][j + y]; + int sv = homv[idx][j + y]; + + if (sh > sv) { // fixate horizontal pixel + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLh[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lah[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbh[idx][j + y]); + } else if (sh < sv) { + dLmaph[dmi] = DIST(lLh[ix][j], lLv[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lav[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbv[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + } else { + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + } + } else { + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + } + + dmi++; + } + } + int idx = mod[2]; + + for (int y = -1; y <= 1; y++) { + // compute distance in a, b, and L + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + dmi++; + } + + // compute eL & eC + float eL = min(max(dLmaph[3], dLmaph[5]), max(dLmapv[1], dLmapv[7])); + float eCa = min(max(dCamaph[3], dCamaph[5]), max(dCamapv[1], dCamapv[7])); + float eCb = min(max(dCbmaph[3], dCbmaph[5]), max(dCbmapv[1], dCbmapv[7])); + + int wh = 0; + + for (int dmi = 0; dmi < 9; dmi++) { + wh += (dLmaph[dmi] <= eL) * (dCamaph[dmi] <= eCa) * (dCbmaph[dmi] <= eCb); + } + + homh[imx][j - 1] += wh; + homh[imx][j] += wh; + homh[imx][j + 1] += wh; + homh[ix][j - 1] += wh; + homh[ix][j] += wh; + homh[ix][j + 1] += wh; + homh[ipx][j - 1] += wh; + homh[ipx][j] += wh; + homh[ipx][j + 1] += wh; + + int wv = 0; + + for (int dmi = 0; dmi < 9; dmi++) { + wv += (dLmapv[dmi] <= eL) * (dCamapv[dmi] <= eCa) * (dCbmapv[dmi] <= eCb); + } + + homv[imx][j - 1] += wv; + homv[imx][j] += wv; + homv[imx][j + 1] += wv; + homv[ix][j - 1] += wv; + homv[ix][j] += wv; + homv[ix][j + 1] += wv; + homv[ipx][j - 1] += wv; + homv[ipx][j] += wv; + homv[ipx][j + 1] += wv; + } + + // finalize image + for (int j = 0; j < W; j++) { + if (ri->ISGREEN(i - 1, j)) { + green[i - 1][j] = rawData[i - 1][j]; + } else { + int hc = homh[imx][j]; + int vc = homv[imx][j]; + + if (hc > vc) { + green[i - 1][j] = gh[(i - 1) % 4][j]; + } else if (hc < vc) { + green[i - 1][j] = gv[(i - 1) % 4][j]; + } else { + green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; + } + } + } + + if (!(i % 20) && plistener) { + plistener->setProgress ((double)i / (H - 2)); + } + } + + // finish H-2th and H-1th row, homogenity value is still valailable + for (int i = H - 1; i < H + 1; i++) + for (int j = 0; j < W; j++) { + int hc = homh[(i - 1) % 3][j]; + int vc = homv[(i - 1) % 3][j]; + + if (hc > vc) { + green[i - 1][j] = gh[(i - 1) % 4][j]; + } else if (hc < vc) { + green[i - 1][j] = gv[(i - 1) % 4][j]; + } else { + green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; + } + } + + // Interpolate R and B + #pragma omp parallel for + for (int i = 0; i < H; i++) { + if (i == 0) { + interpolate_row_rb_mul_pp (rawData, red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); + } else if (i == H - 1) { + interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); + } else { + interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); + } + } +} + +} \ No newline at end of file From 0d7d1cfc8c0baf30ea6a148730a435615ba18026 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 11 Aug 2018 23:40:21 +0200 Subject: [PATCH 08/33] more tweaks to catmull-rom and histogram matching after the feedback by DrSlony --- rtengine/diagonalcurves.cc | 19 +++++++++---------- rtengine/histmatching.cc | 24 +++++++++++++++--------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index 23c1fba47..b2ac7414e 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -289,7 +289,8 @@ inline double catmull_rom_tj(double ti, double xi, double yi, double xj, double yj) { - return sqrt(sqrt(pow2(xj-xi) + pow2(yj-yi))) + ti; + static constexpr double alpha = 0.25; + return pow(sqrt(pow2(xj-xi) + pow2(yj-yi)), alpha) + ti; } @@ -303,7 +304,7 @@ inline void catmull_rom_spline(int n_points, { res_x.reserve(n_points); res_y.reserve(n_points); - + double t0 = 0; double t1 = catmull_rom_tj(t0, p0_x, p0_y, p1_x, p1_y); double t2 = catmull_rom_tj(t1, p1_x, p1_y, p2_x, p2_y); @@ -359,15 +360,13 @@ void catmull_rom_chain(int n_points, int n_cp, double *x, double *y, std::vector &res_x, std::vector &res_y) { static const double epsilon = 1e-5; - // double xr = x[1] - x[0]; - // double yr = y[1] - y[0]; - double xr = x[n_cp-1] - x[0]; - double yr = y[n_cp-1] - y[0]; - double x_first = x[0] - xr * 0.1; + double xr = x[1] - x[0]; + double yr = y[1] - y[0]; + double x_first = x[0] - xr * 0.01; double y_first = xr > epsilon ? (yr / xr) * (x_first - x[0]) + y[0] : y[0]; - // xr = x[n_cp-1] - x[n_cp-2]; - // yr = y[n_cp-1] - x[n_cp-2]; - double x_last = x[n_cp-1] + xr * 0.1; + xr = x[n_cp-1] - x[n_cp-2]; + yr = y[n_cp-1] - x[n_cp-2]; + double x_last = x[n_cp-1] + xr * 0.01; double y_last = xr > epsilon ? (yr / xr) * (x_last - x[0]) + y[0] : y[0]; int segments = n_cp - 1; diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 184152ac8..d4f236d0e 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -221,20 +221,26 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) curve = { DCT_Linear }; // not enough points, fall back to linear } else { CubicSplineCurve c(curve); - curve.pop_back(); - curve.pop_back(); - double gap = coord(step); - while (1 - curve[curve.size()-2] > gap) { - double x = curve[curve.size()-2] + gap; - if (1 - x <= gap / 3) { - break; - } + double mid = coord(idx); + double x = 0.0; + constexpr double shgap = 0.075; + curve = { DCT_Spline }; + while (mid - x > shgap / 2) { curve.push_back(x); curve.push_back(c.getVal(x)); + x += shgap; + } + curve.push_back(mid); + curve.push_back(c.getVal(mid)); + constexpr double hlgap = 0.2; + x = mid + hlgap; + while (1 - x > hlgap / 2) { + curve.push_back(x); + curve.push_back(c.getVal(x)); + x += hlgap; } curve.push_back(1.0); curve.push_back(1.0); - curve.insert(curve.begin(), DCT_Spline); } } From 00ecae33db078d88752177fd9aace332bbcc3cfe Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 12 Aug 2018 00:01:51 +0200 Subject: [PATCH 09/33] EAHD demosaic compilation unit: improved dependencies, #4727 --- rtengine/eahd_demosaic.cc | 199 +++++++++++++++++++++++++++++++++++- rtengine/rawimagesource_i.h | 196 ----------------------------------- 2 files changed, 196 insertions(+), 199 deletions(-) diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index 62eee47a4..5f247378a 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -35,10 +35,203 @@ using namespace std; namespace rtengine { -#define DIST(a,b) (std::fabs(a-b)) +inline void RawImageSource::convert_to_cielab_row (float* ar, float* ag, float* ab, float* oL, float* oa, float* ob) +{ -extern const Settings* settings; -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + for (int j = 0; j < W; j++) { + float r = ar[j]; + float g = ag[j]; + float b = ab[j]; + + float x = lc00 * r + lc01 * g + lc02 * b; + float y = lc10 * r + lc11 * g + lc12 * b; + float z = lc20 * r + lc21 * g + lc22 * b; + + if (y > threshold) { + oL[j] = cache[(int)y]; + } else { + oL[j] = float(903.3f * y / MAXVALF); + } + + oa[j] = 500.f * ((x > threshold ? cache[(int)x] : 7.787f * x / MAXVALF + 16.f / 116.f) - (y > threshold ? cache[(int)y] : 7.787f * y / MAXVALF + 16.f / 116.f)); + ob[j] = 200.f * ((y > threshold ? cache[(int)y] : 7.787f * y / MAXVALF + 16.f / 116.f) - (z > threshold ? cache[(int)z] : 7.787f * z / MAXVALF + 16.f / 116.f)); + } +} + +inline void RawImageSource::interpolate_row_g (float* agh, float* agv, int i) +{ + + for (int j = 0; j < W; j++) { + if (ri->ISGREEN(i, j)) { + agh[j] = rawData[i][j]; + agv[j] = rawData[i][j]; + } else { + int gh = 0; + int gv = 0; + + if (j > 1 && j < W - 2) { + gh = (-rawData[i][j - 2] + 2 * rawData[i][j - 1] + 2 * rawData[i][j] + 2 * rawData[i][j + 1] - rawData[i][j + 2]) / 4; + int maxgh = max(rawData[i][j - 1], rawData[i][j + 1]); + int mingh = min(rawData[i][j - 1], rawData[i][j + 1]); + + if (gh > maxgh) { + gh = maxgh; + } else if (gh < mingh) { + gh = mingh; + } + } else if (j == 0) { + gh = rawData[i][1]; + } else if (j == 1) { + gh = (rawData[i][0] + rawData[i][2]) / 2; + } else if (j == W - 1) { + gh = rawData[i][W - 2]; + } else if (j == W - 2) { + gh = (rawData[i][W - 1] + rawData[i][W - 3]) / 2; + } + + if (i > 1 && i < H - 2) { + gv = (-rawData[i - 2][j] + 2 * rawData[i - 1][j] + 2 * rawData[i][j] + 2 * rawData[i + 1][j] - rawData[i + 2][j]) / 4; + int maxgv = max(rawData[i - 1][j], rawData[i + 1][j]); + int mingv = min(rawData[i - 1][j], rawData[i + 1][j]); + + if (gv > maxgv) { + gv = maxgv; + } else if (gv < mingv) { + gv = mingv; + } + } else if (i == 0) { + gv = rawData[1][j]; + } else if (i == 1) { + gv = (rawData[0][j] + rawData[2][j]) / 2; + } else if (i == H - 1) { + gv = rawData[H - 2][j]; + } else if (i == H - 2) { + gv = (rawData[H - 1][j] + rawData[H - 3][j]) / 2; + } + + agh[j] = gh; + agv[j] = gv; + } + } +} + +inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i) +{ + const auto getPg = [pg](int index) { + return + pg + ? pg[index] + : 0.f; + }; + + const auto getNg = [ng](int index) { + return + ng + ? ng[index] + : 0.f; + }; + + float *nonGreen1 = ar; + float *nonGreen2 = ab; + + if ((ri->ISBLUE(i, 0) || ri->ISBLUE(i, 1))) { + std::swap(nonGreen1, nonGreen2); + } + int j = FC(i, 0) & 1; + if (j) { + // linear R-G interp. horizontally + float val1; + + val1 = cg[0] + rawData[i][1] - cg[1]; + + nonGreen1[0] = CLIP(val1); + // linear B-G interp. vertically + float val2; + + if (i == 0) { + val2 = getNg(0) + rawData[1][0] - cg[0]; + } else if (i == H - 1) { + val2 = getPg(0) + rawData[H - 2][0] - cg[0]; + } else { + val2 = cg[0] + (rawData[i - 1][0] - getPg(0) + rawData[i + 1][0] - getNg(0)) / 2; + } + + nonGreen2[0] = val2; + } + // RGRGR or GRGRGR line + for (; j < W - 1; j += 2) { + // nonGreen of row is simple + nonGreen1[j] = rawData[i][j]; + // non green of next row: cross interpolation + float nonGreen = 0.f; + int n = 0; + + if (i > 0) { + if (j > 0) { + nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); + n++; + } + nonGreen += rawData[i - 1][j + 1] - getPg(j + 1); + n++; + } + + if (i < H - 1) { + if (j > 0) { + nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); + n++; + } + nonGreen += rawData[i + 1][j + 1] - getNg(j + 1); + n++; + } + + nonGreen2[j] = cg[j] + nonGreen / n; + + // linear R-G interp. horizontally + float val1; + + if (j == W - 2) { + val1 = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; + } else { + val1 = cg[j + 1] + (rawData[i][j] - cg[j] + rawData[i][j + 2] - cg[j + 2]) / 2; + } + + nonGreen1[j + 1] = CLIP(val1); + // linear B-G interp. vertically + float val2; + + if (i == 0) { + val2 = getNg(j + 1) + rawData[1][j + 1] - cg[j + 1]; + } else if (i == H - 1) { + val2 = getPg(j + 1) + rawData[H - 2][j + 1] - cg[j + 1]; + } else { + val2 = cg[j + 1] + (rawData[i - 1][j + 1] - getPg(j + 1) + rawData[i + 1][j + 1] - getNg(j + 1)) / 2; + } + + nonGreen2[j + 1] = val2; + } + + if(j == W - 1) { + // nonGreen of row is simple + nonGreen1[j] = rawData[i][j]; + // non green of next row: cross interpolation + float nonGreen = 0.f; + int n = 0; + + if (i > 0) { + nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); + n++; + } + + if (i < H - 1) { + nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); + n++; + } + + nonGreen2[j] = cg[j] + nonGreen / n; + } +} + +#define DIST(a,b) (std::fabs(a-b)) void RawImageSource::eahd_demosaic () { diff --git a/rtengine/rawimagesource_i.h b/rtengine/rawimagesource_i.h index fb85e4933..b24115e0a 100644 --- a/rtengine/rawimagesource_i.h +++ b/rtengine/rawimagesource_i.h @@ -58,202 +58,6 @@ inline void RawImageSource::convert_to_RGB (float &r, float &g, float &b, const b = Y - 1.105f * I + 1.702f * Q; } -inline void RawImageSource::convert_to_cielab_row (float* ar, float* ag, float* ab, float* oL, float* oa, float* ob) -{ - - for (int j = 0; j < W; j++) { - float r = ar[j]; - float g = ag[j]; - float b = ab[j]; - - float x = lc00 * r + lc01 * g + lc02 * b; - float y = lc10 * r + lc11 * g + lc12 * b; - float z = lc20 * r + lc21 * g + lc22 * b; - - if (y > threshold) { - oL[j] = cache[(int)y]; - } else { - oL[j] = float(903.3f * y / MAXVALF); - } - - oa[j] = 500.f * ((x > threshold ? cache[(int)x] : 7.787f * x / MAXVALF + 16.f / 116.f) - (y > threshold ? cache[(int)y] : 7.787f * y / MAXVALF + 16.f / 116.f)); - ob[j] = 200.f * ((y > threshold ? cache[(int)y] : 7.787f * y / MAXVALF + 16.f / 116.f) - (z > threshold ? cache[(int)z] : 7.787f * z / MAXVALF + 16.f / 116.f)); - } -} - -inline void RawImageSource::interpolate_row_g (float* agh, float* agv, int i) -{ - - for (int j = 0; j < W; j++) { - if (ri->ISGREEN(i, j)) { - agh[j] = rawData[i][j]; - agv[j] = rawData[i][j]; - } else { - int gh = 0; - int gv = 0; - - if (j > 1 && j < W - 2) { - gh = (-rawData[i][j - 2] + 2 * rawData[i][j - 1] + 2 * rawData[i][j] + 2 * rawData[i][j + 1] - rawData[i][j + 2]) / 4; - int maxgh = max(rawData[i][j - 1], rawData[i][j + 1]); - int mingh = min(rawData[i][j - 1], rawData[i][j + 1]); - - if (gh > maxgh) { - gh = maxgh; - } else if (gh < mingh) { - gh = mingh; - } - } else if (j == 0) { - gh = rawData[i][1]; - } else if (j == 1) { - gh = (rawData[i][0] + rawData[i][2]) / 2; - } else if (j == W - 1) { - gh = rawData[i][W - 2]; - } else if (j == W - 2) { - gh = (rawData[i][W - 1] + rawData[i][W - 3]) / 2; - } - - if (i > 1 && i < H - 2) { - gv = (-rawData[i - 2][j] + 2 * rawData[i - 1][j] + 2 * rawData[i][j] + 2 * rawData[i + 1][j] - rawData[i + 2][j]) / 4; - int maxgv = max(rawData[i - 1][j], rawData[i + 1][j]); - int mingv = min(rawData[i - 1][j], rawData[i + 1][j]); - - if (gv > maxgv) { - gv = maxgv; - } else if (gv < mingv) { - gv = mingv; - } - } else if (i == 0) { - gv = rawData[1][j]; - } else if (i == 1) { - gv = (rawData[0][j] + rawData[2][j]) / 2; - } else if (i == H - 1) { - gv = rawData[H - 2][j]; - } else if (i == H - 2) { - gv = (rawData[H - 1][j] + rawData[H - 3][j]) / 2; - } - - agh[j] = gh; - agv[j] = gv; - } - } -} - -inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i) -{ - const auto getPg = [pg](int index) { - return - pg - ? pg[index] - : 0.f; - }; - - const auto getNg = [ng](int index) { - return - ng - ? ng[index] - : 0.f; - }; - - float *nonGreen1 = ar; - float *nonGreen2 = ab; - - if ((ri->ISBLUE(i, 0) || ri->ISBLUE(i, 1))) { - std::swap(nonGreen1, nonGreen2); - } - int j = FC(i, 0) & 1; - if (j) { - // linear R-G interp. horizontally - float val1; - - val1 = cg[0] + rawData[i][1] - cg[1]; - - nonGreen1[0] = CLIP(val1); - // linear B-G interp. vertically - float val2; - - if (i == 0) { - val2 = getNg(0) + rawData[1][0] - cg[0]; - } else if (i == H - 1) { - val2 = getPg(0) + rawData[H - 2][0] - cg[0]; - } else { - val2 = cg[0] + (rawData[i - 1][0] - getPg(0) + rawData[i + 1][0] - getNg(0)) / 2; - } - - nonGreen2[0] = val2; - } - // RGRGR or GRGRGR line - for (; j < W - 1; j += 2) { - // nonGreen of row is simple - nonGreen1[j] = rawData[i][j]; - // non green of next row: cross interpolation - float nonGreen = 0.f; - int n = 0; - - if (i > 0) { - if (j > 0) { - nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); - n++; - } - nonGreen += rawData[i - 1][j + 1] - getPg(j + 1); - n++; - } - - if (i < H - 1) { - if (j > 0) { - nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); - n++; - } - nonGreen += rawData[i + 1][j + 1] - getNg(j + 1); - n++; - } - - nonGreen2[j] = cg[j] + nonGreen / n; - - // linear R-G interp. horizontally - float val1; - - if (j == W - 2) { - val1 = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; - } else { - val1 = cg[j + 1] + (rawData[i][j] - cg[j] + rawData[i][j + 2] - cg[j + 2]) / 2; - } - - nonGreen1[j + 1] = CLIP(val1); - // linear B-G interp. vertically - float val2; - - if (i == 0) { - val2 = getNg(j + 1) + rawData[1][j + 1] - cg[j + 1]; - } else if (i == H - 1) { - val2 = getPg(j + 1) + rawData[H - 2][j + 1] - cg[j + 1]; - } else { - val2 = cg[j + 1] + (rawData[i - 1][j + 1] - getPg(j + 1) + rawData[i + 1][j + 1] - getNg(j + 1)) / 2; - } - - nonGreen2[j + 1] = val2; - } - - if(j == W - 1) { - // nonGreen of row is simple - nonGreen1[j] = rawData[i][j]; - // non green of next row: cross interpolation - float nonGreen = 0.f; - int n = 0; - - if (i > 0) { - nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); - n++; - } - - if (i < H - 1) { - nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); - n++; - } - - nonGreen2[j] = cg[j] + nonGreen / n; - } -} - inline void RawImageSource::interpolate_row_rb_mul_pp (const array2D &rawData, float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip) { From 2f2065cf9a45573fec974d678159c8cadfa04925 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 12 Aug 2018 23:20:31 +0200 Subject: [PATCH 10/33] fixed typo leading to artifacts in catmull-rom splines in extreme cases --- rtengine/diagonalcurves.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index b2ac7414e..3955c8e01 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -367,7 +367,7 @@ void catmull_rom_chain(int n_points, int n_cp, double *x, double *y, xr = x[n_cp-1] - x[n_cp-2]; yr = y[n_cp-1] - x[n_cp-2]; double x_last = x[n_cp-1] + xr * 0.01; - double y_last = xr > epsilon ? (yr / xr) * (x_last - x[0]) + y[0] : y[0]; + double y_last = xr > epsilon ? (yr / xr) * (x_last - x[n_cp-1]) + y[n_cp-1] : y[n_cp-1]; int segments = n_cp - 1; int points_segments = n_points / segments; From 97e73457ee07a2bfa93fb925adda1774f779e90d Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 13 Aug 2018 14:18:59 +0200 Subject: [PATCH 11/33] histmatching: use better spaced points for the generated curve --- rtengine/histmatching.cc | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index d4f236d0e..b2fe436fd 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -221,26 +221,17 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) curve = { DCT_Linear }; // not enough points, fall back to linear } else { CubicSplineCurve c(curve); - double mid = coord(idx); + double gap = 0.05; double x = 0.0; - constexpr double shgap = 0.075; curve = { DCT_Spline }; - while (mid - x > shgap / 2) { + while (x < 1.0) { curve.push_back(x); curve.push_back(c.getVal(x)); - x += shgap; - } - curve.push_back(mid); - curve.push_back(c.getVal(mid)); - constexpr double hlgap = 0.2; - x = mid + hlgap; - while (1 - x > hlgap / 2) { - curve.push_back(x); - curve.push_back(c.getVal(x)); - x += hlgap; + x += gap; + gap *= 1.4; } curve.push_back(1.0); - curve.push_back(1.0); + curve.push_back(c.getVal(1.0)); } } From faaaa016f0951d88aacea8c8e978aa387bdc9168 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 13 Aug 2018 22:47:41 +0200 Subject: [PATCH 12/33] Star icons more narrow to not bloat thumbnail size The star icons used for ranking thumbnails are now of the "narrow" size, i.e. 10x16px. This change removes mostly the padding, which caused the ranking buttons to bloat the minimum thumbnail size to an unacceptably large size. --- .../png/dark/star-gold-hollow-narrow.png | Bin 0 -> 426 bytes .../themed/png/dark/star-gold-hollow.png | Bin 0 -> 564 bytes .../themed/png/dark/star-gold-narrow.png | Bin 0 -> 419 bytes rtdata/images/themed/png/dark/star-gold.png | Bin 0 -> 569 bytes .../themed/png/dark/star-hollow-narrow.png | Bin 0 -> 420 bytes rtdata/images/themed/png/dark/star-hollow.png | Bin 0 -> 538 bytes rtdata/images/themed/png/dark/star-narrow.png | Bin 0 -> 405 bytes rtdata/images/themed/png/dark/star-small.png | Bin 396 -> 434 bytes rtdata/images/themed/png/dark/star.png | Bin 0 -> 540 bytes .../png/light/star-gold-hollow-narrow.png | Bin 0 -> 426 bytes .../themed/png/light/star-gold-hollow.png | Bin 0 -> 564 bytes .../themed/png/light/star-gold-narrow.png | Bin 0 -> 419 bytes rtdata/images/themed/png/light/star-gold.png | Bin 0 -> 569 bytes .../themed/png/light/star-hollow-narrow.png | Bin 0 -> 409 bytes .../images/themed/png/light/star-hollow.png | Bin 0 -> 555 bytes .../images/themed/png/light/star-narrow.png | Bin 0 -> 405 bytes rtdata/images/themed/png/light/star-small.png | Bin 397 -> 446 bytes rtdata/images/themed/png/light/star.png | Bin 0 -> 537 bytes .../themed/svg/star-gold-hollow-narrow.svg | 128 ++++++++++++++++++ rtdata/images/themed/svg/star-gold-narrow.svg | 128 ++++++++++++++++++ .../images/themed/svg/star-hollow-narrow.svg | 128 ++++++++++++++++++ rtdata/images/themed/svg/star-narrow.svg | 128 ++++++++++++++++++ rtdata/images/themed/svg/star-small.svg | 12 +- rtdata/images/themed/svg/template-narrow.svg | 110 +++++++++++++++ rtgui/filethumbnailbuttonset.cc | 6 +- 25 files changed, 631 insertions(+), 9 deletions(-) create mode 100644 rtdata/images/themed/png/dark/star-gold-hollow-narrow.png create mode 100644 rtdata/images/themed/png/dark/star-gold-hollow.png create mode 100644 rtdata/images/themed/png/dark/star-gold-narrow.png create mode 100644 rtdata/images/themed/png/dark/star-gold.png create mode 100644 rtdata/images/themed/png/dark/star-hollow-narrow.png create mode 100644 rtdata/images/themed/png/dark/star-hollow.png create mode 100644 rtdata/images/themed/png/dark/star-narrow.png create mode 100644 rtdata/images/themed/png/dark/star.png create mode 100644 rtdata/images/themed/png/light/star-gold-hollow-narrow.png create mode 100644 rtdata/images/themed/png/light/star-gold-hollow.png create mode 100644 rtdata/images/themed/png/light/star-gold-narrow.png create mode 100644 rtdata/images/themed/png/light/star-gold.png create mode 100644 rtdata/images/themed/png/light/star-hollow-narrow.png create mode 100644 rtdata/images/themed/png/light/star-hollow.png create mode 100644 rtdata/images/themed/png/light/star-narrow.png create mode 100644 rtdata/images/themed/png/light/star.png create mode 100644 rtdata/images/themed/svg/star-gold-hollow-narrow.svg create mode 100644 rtdata/images/themed/svg/star-gold-narrow.svg create mode 100644 rtdata/images/themed/svg/star-hollow-narrow.svg create mode 100644 rtdata/images/themed/svg/star-narrow.svg create mode 100644 rtdata/images/themed/svg/template-narrow.svg diff --git a/rtdata/images/themed/png/dark/star-gold-hollow-narrow.png b/rtdata/images/themed/png/dark/star-gold-hollow-narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ce704d69962500bc43d29a03893277eb75c3ab GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^AhrMtGmyL+__-KJ1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!k4T`O_>O=u<5X=vX`rB1fKQ0)|5*&~1wQ|0GW<_q_&QoBbvQ2kia`7;&YI5x1X|m&SZ`kDcbd|%VUPWdP gBQCB5vzb{Ky!?37K02GI0L^0XboFyt=akR{0E0V@RR910 literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/star-gold-hollow.png b/rtdata/images/themed/png/dark/star-gold-hollow.png new file mode 100644 index 0000000000000000000000000000000000000000..44bf29d1226749f782d91fc5e129e2e2472f1070 GIT binary patch literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1=Gpc2=J66gGa%A(Blj1mTCX9dTS zlA_F{(vr;lJl)`o#G+KkoXqT0g^ZGt0xNy}ERK!`}5n0T@z;^_M8K-LVNdpB90(?ST|Ic7>FYx(4li`0g1Bjf3 zL{4Y;4@5x0*$hBs5GlqBZ{vY_1xkYaf;ThFVon$6a$ccm6wn}{8MQP!RTn6C$kW9! zMB;L?fD02(LeLF?PUX0cBZfh4k3=>oTO8u@X)EZnnCzrDC;3R+0-mQF_lp9|k|Mc7 zPAI%veBeNU#<>FrN|sD;+|=lJ{B}UaX+^faPM#*?8wb=R)k~PZp3qv-WRWH#?8p|A z#4REs;(LL0w%Y0k8X6jhN(7Vo54$-!W{Ry?%E|4@y!6I`Ic)*`(*pQ7+^0QeXLhb< zcIg*kK77)Whll&1OlF&n4P$pbtWu5FLO}FGjW5t`k_6%tPIO7wM!$prt|=P O!{F)a=d#Wzp$P!>y2b?n literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/star-gold-narrow.png b/rtdata/images/themed/png/dark/star-gold-narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..32710fb9d0670351acaf54d2e9a68a420a58fd40 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^AhrMtGmyL+__-KJ1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!k4T`O_>O=u<5X=vX`rB1fKQ04dx6jYiwytIGW@^8@c%W# z|C0>=&oKNy1tx)l=V0h8gLEp-TA(hzk|4iehP6WLH?tR*&kK`sUYPp&;O#p=8B0$W z#}JO|$q5ITm<~M2GpJmdKI;Vst0K1iuL;wH) literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/star-gold.png b/rtdata/images/themed/png/dark/star-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..5e38050052c6eca005a09f2a42db0300cb6ddd64 GIT binary patch literal 569 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}s_7T^=&`u_~W|FdAUmf`foctlpn@Hv55qa8a~Ec9ZZH*bZDOI!FB$gZ#B+u3l3jVHnO zW>W#P=!{a1q_$TFS4q8Dc=Ec$ver4xPais%+%#)@#IN8b!7X=wUULlJnHO~~|9!nBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!k4T`O_>O=u<5X=vX`rA=fKQ0)>C>m(3w+Lk!S(CcfizI$ z%$YMl#_ij;&z(DW`SRscj}%mZ>Um0n{DS!yymOgs)#J+8^~D7xn|1)jojhF}LpZJ{ z3$QSERK!`}5n0T@z;^_M8K-LVNdpBH1AIbUPoF;RUf^@)%$c)b0AW0O z^av;pVRJi4PXa3DE(!7rZeYkuF!tnO7AsfEoWHLQD7?qh#W6(UvhVqgd`$)-tQTf8 zIUk>NOK6!IpM{WcZ{nh6Yd3Lsu`-i72CJ7xk{)?Q{P9^Ba>?Ap()0e_%7k+V_G~IU zu(jEsaKdjsk(KEMi@x++I4{ioQ)`m<2U)u&dC>)y4rWq;-A`9e`)!)R{Oya+Bp>_3 zeoM9~uiGNY{4Va~43BU%-xbWs+(CY}M=zXUj-FMvsK>T@n^seopTHNMJ-0K}*~<7A v7(X~6@p>U|-pzyIiI$L>^6bTD|j`njxgN@xNAuKdha literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/star-narrow.png b/rtdata/images/themed/png/dark/star-narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..bdcc73bfea787978667eb4d5a079eba9ded0964b GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^AhrMtGmyL+__-KJ1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!k4T`O_>O=u<5X=vX`rBDfKQ04dx6hcFgODS=gysjaDn8h zQ>V_KKVPQYcpj*jyCldjn87=btCBy_R?|SW-s6@cP}tnl#W95AdUC=6&a@^^RfV+J z6)K_!1fHnPSaj;ZDzzCR2M%0NS;06(qp*;DQq!>}hf58OlHH07>YZ!>&tuC$;mqLa L>gTe~DWM4fLw1l> literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/star-small.png b/rtdata/images/themed/png/dark/star-small.png index c8f21783cbd2ffc5bf35d191985dfd494593fe9e..db895d932b649ed45468034361bf96a2761ca235 100644 GIT binary patch delta 177 zcmeBS-o(6ti?ROPxpQaEoN+JkIeYdjkOAQW*$}RM_sJ~`3=CW)L4Lt5l?*b`dRcLS ztPfpoP5_EVc)B=-a9mFgXkubh2s3Lky3)OX$2n2s@KM$y7g9V$5=4q;99bap;=q9e zN?cQdrY0n0@G!09Oi2)6)iz5`@L)5(!KHaL_+XD)x-h3fbEM}FVdQ&MBb@08qC`oB#j- delta 139 zcmdnQ+{3(qi?QClz~{`FGpA3V29l>vor17|jPvKupFMl_waLi<1_lPMk|4iehAQ4< z6;@ZP01p+#wp5^~k*AAe2*>s0gah0&L>BOz;|yq9B+%j~VkW|D+;n!5uVR*}l;WyL l7FJn>o=XMnY?l}q3UgTg+;BBZ2kK_ERK!`}5n0T@z;^_M8K-LVNdpB{0(?ST&z(DW=FA!Q0v{lG76wk8 zIt66HMP8KaJOrxeDGBlmc5PtDFN;bRmS-}s`kIo+1Qg%p>Eak7aoP9$ZoVc15w-`- zUB>lMk}{q=BFoj(+Io*26g78`xv}zH%vd%+9u3v$GcN5zvh^{Z?qCbba=$XHx%ITzC4{xOB*TFns26;3wl1w&*F2 v7artp(ENJjY|fd?uW5^Zty`O1@snYXoc?y-t!nRqzF_cl^>bP0l+XkK5DU}4 literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/star-gold-hollow-narrow.png b/rtdata/images/themed/png/light/star-gold-hollow-narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ce704d69962500bc43d29a03893277eb75c3ab GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^AhrMtGmyL+__-KJ1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!k4T`O_>O=u<5X=vX`rB1fKQ0)|5*&~1wQ|0GW<_q_&QoBbvQ2kia`7;&YI5x1X|m&SZ`kDcbd|%VUPWdP gBQCB5vzb{Ky!?37K02GI0L^0XboFyt=akR{0E0V@RR910 literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/star-gold-hollow.png b/rtdata/images/themed/png/light/star-gold-hollow.png new file mode 100644 index 0000000000000000000000000000000000000000..44bf29d1226749f782d91fc5e129e2e2472f1070 GIT binary patch literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1=Gpc2=J66gGa%A(Blj1mTCX9dTS zlA_F{(vr;lJl)`o#G+KkoXqT0g^ZGt0xNy}ERK!`}5n0T@z;^_M8K-LVNdpB90(?ST|Ic7>FYx(4li`0g1Bjf3 zL{4Y;4@5x0*$hBs5GlqBZ{vY_1xkYaf;ThFVon$6a$ccm6wn}{8MQP!RTn6C$kW9! zMB;L?fD02(LeLF?PUX0cBZfh4k3=>oTO8u@X)EZnnCzrDC;3R+0-mQF_lp9|k|Mc7 zPAI%veBeNU#<>FrN|sD;+|=lJ{B}UaX+^faPM#*?8wb=R)k~PZp3qv-WRWH#?8p|A z#4REs;(LL0w%Y0k8X6jhN(7Vo54$-!W{Ry?%E|4@y!6I`Ic)*`(*pQ7+^0QeXLhb< zcIg*kK77)Whll&1OlF&n4P$pbtWu5FLO}FGjW5t`k_6%tPIO7wM!$prt|=P O!{F)a=d#Wzp$P!>y2b?n literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/star-gold-narrow.png b/rtdata/images/themed/png/light/star-gold-narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..32710fb9d0670351acaf54d2e9a68a420a58fd40 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^AhrMtGmyL+__-KJ1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!k4T`O_>O=u<5X=vX`rB1fKQ04dx6jYiwytIGW@^8@c%W# z|C0>=&oKNy1tx)l=V0h8gLEp-TA(hzk|4iehP6WLH?tR*&kK`sUYPp&;O#p=8B0$W z#}JO|$q5ITm<~M2GpJmdKI;Vst0K1iuL;wH) literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/star-gold.png b/rtdata/images/themed/png/light/star-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..5e38050052c6eca005a09f2a42db0300cb6ddd64 GIT binary patch literal 569 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}s_7T^=&`u_~W|FdAUmf`foctlpn@Hv55qa8a~Ec9ZZH*bZDOI!FB$gZ#B+u3l3jVHnO zW>W#P=!{a1q_$TFS4q8Dc=Ec$ver4xPais%+%#)@#IN8b!7X=wUULlJnHO~~|9!nBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!k4T`O_>O=u<5X=vX`rA=fKQ04dx4LNii(<=nyRWQkkr!B zQdd_8GLS)ovgu=>dY+OXzhDNQvRqqH^*E0JFa0+D90{Pfxu=U`2*>s0gae#q&7R2$ zX=gR^xf2AgapW4MB$y-?h$SR=i0d$WS!mB>I2qZb-MEB-Sy{}PA@nkPLd(-KeV`Ex Mp00i_>zopr0HObPivR!s literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/star-hollow.png b/rtdata/images/themed/png/light/star-hollow.png new file mode 100644 index 0000000000000000000000000000000000000000..3e610948d503baa3930bfc1c393d616b105df349 GIT binary patch literal 555 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1=Gpc2=J66gGa%A(Blj1mTCX9dTS zlA_F{(vr;lJl)`o#G+KkoXqT0g^ZGt0xNy}ERK!`}5n0T@z;^_M8K-LVNdpD70(?ST)zsA73w%_;KvPrG+uIvR zLbyN@D668P0%5GrbeIX$#a9yK7u>**8_&xm>1j}Dtx_B?>w$1GQ0Abgi(`nyK6M;_UiycQegIph(6ew6M;__)M=wq4eq&!FX$i)R*Pdlo_SFml&XVglWpb?gk zkTE48A;Bm=MPT-U1u>!;yY6%}8c%dIXqU{HwBn%Q0=bRMY6^Y^{z@kp)YaS_9R-_} z6E3@maIvx;byQNQ<`U!L^4jREYkEWDk;Yk`r#=NM=e#?_`LLs4T}r|XQ^rN^vlGm literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/star-narrow.png b/rtdata/images/themed/png/light/star-narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..78c8eea8a7070534f1820f52b1adb02c7b5c8f68 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^AhrMtGmyL+__-KJ1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!k4T`O_>O=u<5X=vX`rBDfKQ04dx4Lts;Zir8k|&DR|j$- z04Vrnj_^C6V(yY4zhH(u-%4&lb+<%Yg9C>{9s`BVJzX3_IIbrr9N-LV^mJ56^A*?O zPT<%QkR_IyFi|7FBq6~gM2OkT$7~zRBriQLhf9r(tlf$XPEu^Y9;RfK0*zqsboFyt I=akR{0JB?ph5!Hn literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/star-small.png b/rtdata/images/themed/png/light/star-small.png index 8ff98fa6bb095c7b692af37abaf340a78791c5fb..2bb54647a72ac9c3abd14476fe116603aeffa671 100644 GIT binary patch delta 194 zcmeBW-p9Owm9btuz$e626%5=9d>{-Usivl;uC5Mb7#kaFfB{gXBS~~K0|NtZNswQ# zOC>|Bba1w|3ah1V+6~{64}cO8o-U3d9M_WrnwZ!W!U~&=rt~i0aTnA$d_&^Mg%n?r z1QG5TM;3%+95`@5hi}Ryfz$*JD;=hlH%}Z;;0?QT?7#%Zv^9nzcC2YEvn;xsBz3&J h_ym|APFrNeuw=D}^V@Z*u|P{0JYD@<);T3K0RUn{JFEZz delta 145 zcmdnT+{?Uym9btfz$e7jy}(CRRaH+G}P48fDFOo`?DAr7`RG; z{DK*(INZb&w5$R$c|)G?14WHJT^vI=t|uoP;GQ9}fG3Sv<8UC0lXMpwSF_}*$-2!7 sS*lWst0GxgWe@OdQ~Junc8P%@bPCIkb&(F9K<%6ip00i_>zopr05~ru6aWAK diff --git a/rtdata/images/themed/png/light/star.png b/rtdata/images/themed/png/light/star.png new file mode 100644 index 0000000000000000000000000000000000000000..f29ccfdcdcce445aebcf033cf59f6e3f4609d65a GIT binary patch literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1=Gpc2=J66gGa%A(Blj1mTCX9dTS zlA_F{(vr;lJl)`o#G+KkoXqT0g^ZGt0xNy}ERK!`}5n0T@z;^_M8K-LVNdpB{0(?ST)zsA73w(g2s;a7nh6a#? z02LJ#h@iTTk^HjcXe9%yL-7R$K=JLKE{-7*my-otn0RK$ ztZem=x#*yBj!93&k3qXh`RKF_0_OyuW^l9=+VD=gGGlpzMUWUH509@D56_yj+>$Or z5<%KirrbI#aYIIuFL=lndR>|dDBET>nW2HVh-e;VSCtNAYx#!!Pw!8hmpaS3IhWlmf|InTCA+g tjdNIvTeKbZ=H+o*Wai{`-*SPG!QqhV-;Ap{hCnYcc)I$ztaD0e0svhfr;h*t literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/svg/star-gold-hollow-narrow.svg b/rtdata/images/themed/svg/star-gold-hollow-narrow.svg new file mode 100644 index 000000000..82ab83a4a --- /dev/null +++ b/rtdata/images/themed/svg/star-gold-hollow-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-gold-narrow.svg b/rtdata/images/themed/svg/star-gold-narrow.svg new file mode 100644 index 000000000..ee54c8214 --- /dev/null +++ b/rtdata/images/themed/svg/star-gold-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-hollow-narrow.svg b/rtdata/images/themed/svg/star-hollow-narrow.svg new file mode 100644 index 000000000..66b1c233c --- /dev/null +++ b/rtdata/images/themed/svg/star-hollow-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-narrow.svg b/rtdata/images/themed/svg/star-narrow.svg new file mode 100644 index 000000000..90add16d5 --- /dev/null +++ b/rtdata/images/themed/svg/star-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-small.svg b/rtdata/images/themed/svg/star-small.svg index f15d135b8..cd7a9b8ef 100644 --- a/rtdata/images/themed/svg/star-small.svg +++ b/rtdata/images/themed/svg/star-small.svg @@ -26,8 +26,8 @@ borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:zoom="50.625" - inkscape:cx="8" + inkscape:zoom="51.375" + inkscape:cx="8.0194647" inkscape:cy="8" inkscape:document-units="px" inkscape:current-layer="layer1" @@ -109,8 +109,8 @@ transform="translate(0,-8)"> + transform="matrix(0.86350439,-0.28029946,0.28056958,0.86267304,-3.3971484,4.0671624)" + inkscape:transform-center-y="-0.51970384" /> diff --git a/rtdata/images/themed/svg/template-narrow.svg b/rtdata/images/themed/svg/template-narrow.svg new file mode 100644 index 000000000..9a6321317 --- /dev/null +++ b/rtdata/images/themed/svg/template-narrow.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + diff --git a/rtgui/filethumbnailbuttonset.cc b/rtgui/filethumbnailbuttonset.cc index d32c1c339..556397b7b 100644 --- a/rtgui/filethumbnailbuttonset.cc +++ b/rtgui/filethumbnailbuttonset.cc @@ -42,9 +42,9 @@ FileThumbnailButtonSet::FileThumbnailButtonSet (FileBrowserEntry* myEntry) { if (!iconsLoaded) { - unRankIcon = RTImage::createFromPng ("star-hollow-small.png"); - rankIcon = RTImage::createFromPng ("star-gold-small.png"); - gRankIcon = RTImage::createFromPng ("star-small.png"); + unRankIcon = RTImage::createFromPng ("star-hollow-narrow.png"); + rankIcon = RTImage::createFromPng ("star-gold-narrow.png"); + gRankIcon = RTImage::createFromPng ("star-narrow.png"); trashIcon = RTImage::createFromPng ("trash-small.png"); unTrashIcon = RTImage::createFromPng ("trash-remove-small.png"); processIcon = RTImage::createFromPng ("gears-small.png"); From e7697f5980aca4149d491c14a15486243ef02fee Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 13 Aug 2018 23:11:31 +0200 Subject: [PATCH 13/33] Updated ICC Generator icon --- rtdata/images/themed/png/dark/gamut-plus.png | Bin 869 -> 548 bytes rtdata/images/themed/png/light/gamut-plus.png | Bin 864 -> 546 bytes rtdata/images/themed/svg/gamut-plus.svg | 10 ++-------- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/rtdata/images/themed/png/dark/gamut-plus.png b/rtdata/images/themed/png/dark/gamut-plus.png index 091e38337cf0d9ea1d91e507edbe40539d3b0468..a83f5e603e56df7a14d1eca66844f26ba4712286 100644 GIT binary patch delta 321 zcmaFLwuEJZ1SbnK0|SFlq{8WmTM{PrYE8^jnCPiG(L}UfH^3*v^~{+w?gc(T5)MwE zK79@h;37cA*|TSXf}i(`ny z`fMIH40DLC4CxY3fbZms)d+O7b>{VY7{=QjY(SJ@Q0WJ?)mCRmIv|l zZS*<5@ZPl4h{TP8Vr+^|Jm!LoN}G68O9U7gPMa&uKJvVBGSCkUp00i_>zopr0Jpq- A;Q#;t delta 645 zcmV;00($+V1my;h7#Ro#0002scRlz3000DYLP=Bz2nYy#2xN$n?HG~EC6TKjk%B3a zBwc?3J4r-AR7i={m9dKxQ4q$zdD(CmBnSpQxKzP(f_mAPh%sOz2;!-YTlpv08Z7iU zw6L|YwZF6%3qgojU6QxE=HM(Wl1kw)sjf&c``%cXNG|T?k_#42^Vpf4@AqbQ_C4Sq z8v%e)Y8L>cl$)m!8Rv&-h-G#+k3|AJ&%1x=y6)v=0ajE%Ykg4&amRJt7q)HhPsbL}_MT0kGwH-jxM6{>LH#%$y#rE6n`7(P&&f4Is2dl}aT>L~9eU6(Piy z@B6PdHa42T@o8Cjin7`4+7$fI7_+0bF1xO4FH%7$fQZsluDwE`utP*I0X$YpU7LRw z5ZWTG^)#Rk0Jd%KE2W+=b6F_`DPv~jjE|>cd1i|@cvw0)xoxi?8tyWuQ z=5s^@0K*^%{IJAUt92m=f``VK+d_W`R!Y5=Qr1ocB$LTBMyISX=5w)F>`%s(QfFha z*n{D4cppGq2=R@XKgHwmgSjd&#-xS#-8mt|-q_#ibXL3F?p***5CkzIsvBe8=kxg% z5pkG!D8RC;bz=;enFoVGlbJ2g^KSKey+;6k5YgLID)ljw$qb@IPpkj{i0D;oB9XYH zl)7hG)&Vn@bGh92c|>OdMyKeIhz2Si^U f%i7Ef=fAOEwNv;nL>?G}00000NkvXXu0mjfz7;Kl diff --git a/rtdata/images/themed/png/light/gamut-plus.png b/rtdata/images/themed/png/light/gamut-plus.png index 43c0c321a4da3556fdc034be75bf38c9c182ee27..c41e5a39b0f83a04fe56ba4b700caa1e0cd886ad 100644 GIT binary patch delta 319 zcmaFBwuohd1SbnK0|SFlq{8WmTM{PrYE8^jnCPiG(L}V~AiyWY)xE$+6$~^qG=Q|S zvND9Lq@<*xq5@&VNuWsJaWie8c>*Ote!&czCkrR?w3oBbTO$+bV5H9IG}jI&x53lJ zF+}2Wa)JY^T*9P40UzCLhk^*!U_qHW$At`RY>o;72?-BG>qSCZiz8SZg97+=FG!fG z<-sY=L;UNDD0F~daCh)p{U(> z#$=5jj2=ZYOy0gzSSFgYsyDZ=9Bq7}?6^_dp({F|ukqpR1zZuL>mP8ny$vcAm|V%i x?bDLyV0%`tBIOiYggnQFgHswT-6c0LGki9a;jFoKr3~nL22WQ%mvv4FO#o>1WSam0 delta 640 zcmV-`0)PFY1mFgc7#Ro#0002scRlz3000DYLP=Bz2nYy#2xN$n?HG~EC6TKjk%B3a zBwc?3Hc3Q5R7i={mA{JyD5YyL=mwtg&>HhHnH+gur*ld z6h+E*TOJ-%FKWF zUDv%dEg)$ZO#s3$tN}o$(`kC1_drCduIs`WQv=cuXlw@7+9+VRR4RQQH?-E@=I7@h ziO7X~K7aY33}OMyyg2?Bk^1`j`j4o;)oKmf?e+_1KH+)Z#hC%o8i+_ODOhX$2Eb{@ zajqnd`J)E8T<$o4Q={ho-rim#F0g-CES?F1pdupInOPjidA_x^_4Yu3QYwqlEh{1) zyWQ>}>R(=7KB<(tGZ+kR6VWjMJpk_kw5G~nbVZC|o6*daQa73Tu87PrbIn@&+8FZ* zfW(O>0Tx9B03-;4dbwOy{eJ(Nwe}u>uSE26I2^v)-roM6B$^7q=nRO6R!UHv?e%)M zh^WQPRp0l&Oe2~Ku-0aYXrG97h-hGpc?iJHDx3&l=2t}Y!T0^$!-__2;!XbBmiplQ aH}(_0%HIsnFO$Cj0000 - Date: Mon, 13 Aug 2018 23:23:22 +0200 Subject: [PATCH 14/33] Icons renamed to reflect their size --- ...png => square-toggle-black-off-narrow.png} | Bin ....png => square-toggle-black-on-narrow.png} | Bin ....png => square-toggle-blue-off-narrow.png} | Bin ...n.png => square-toggle-blue-on-narrow.png} | Bin ....png => square-toggle-gray-off-narrow.png} | Bin ...n.png => square-toggle-gray-on-narrow.png} | Bin ...png => square-toggle-green-off-narrow.png} | Bin ....png => square-toggle-green-on-narrow.png} | Bin ...> square-toggle-luminosity-off-narrow.png} | Bin ...=> square-toggle-luminosity-on-narrow.png} | Bin ...f.png => square-toggle-red-off-narrow.png} | Bin ...on.png => square-toggle-red-on-narrow.png} | Bin ...png => square-toggle-theme-off-narrow.png} | Bin ....png => square-toggle-theme-on-narrow.png} | Bin ...png => square-toggle-white-off-narrow.png} | Bin ....png => square-toggle-white-on-narrow.png} | Bin ...png => square-toggle-black-off-narrow.png} | Bin ....png => square-toggle-black-on-narrow.png} | Bin ....png => square-toggle-blue-off-narrow.png} | Bin ...n.png => square-toggle-blue-on-narrow.png} | Bin ....png => square-toggle-gray-off-narrow.png} | Bin ...n.png => square-toggle-gray-on-narrow.png} | Bin ...png => square-toggle-green-off-narrow.png} | Bin ....png => square-toggle-green-on-narrow.png} | Bin ...> square-toggle-luminosity-off-narrow.png} | Bin ...=> square-toggle-luminosity-on-narrow.png} | Bin ...f.png => square-toggle-red-off-narrow.png} | Bin ...on.png => square-toggle-red-on-narrow.png} | Bin ...png => square-toggle-theme-off-narrow.png} | Bin ....png => square-toggle-theme-on-narrow.png} | Bin ...png => square-toggle-white-off-narrow.png} | Bin ....png => square-toggle-white-on-narrow.png} | Bin ...svg => square-toggle-black-off-narrow.svg} | 0 ....svg => square-toggle-black-on-narrow.svg} | 0 ....svg => square-toggle-blue-off-narrow.svg} | 0 ...n.svg => square-toggle-blue-on-narrow.svg} | 0 ....svg => square-toggle-gray-off-narrow.svg} | 0 ...n.svg => square-toggle-gray-on-narrow.svg} | 0 ...svg => square-toggle-green-off-narrow.svg} | 0 ....svg => square-toggle-green-on-narrow.svg} | 0 ...> square-toggle-luminosity-off-narrow.svg} | 0 ...=> square-toggle-luminosity-on-narrow.svg} | 0 ...f.svg => square-toggle-red-off-narrow.svg} | 0 ...on.svg => square-toggle-red-on-narrow.svg} | 0 ...svg => square-toggle-theme-off-narrow.svg} | 0 ....svg => square-toggle-theme-on-narrow.svg} | 0 ...svg => square-toggle-white-off-narrow.svg} | 0 ....svg => square-toggle-white-on-narrow.svg} | 0 rtgui/previewmodepanel.cc | 32 +++++++++--------- 49 files changed, 16 insertions(+), 16 deletions(-) rename rtdata/images/themed/png/dark/{square-toggle-black-off.png => square-toggle-black-off-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-black-on.png => square-toggle-black-on-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-blue-off.png => square-toggle-blue-off-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-blue-on.png => square-toggle-blue-on-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-gray-off.png => square-toggle-gray-off-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-gray-on.png => square-toggle-gray-on-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-green-off.png => square-toggle-green-off-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-green-on.png => square-toggle-green-on-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-luminosity-off.png => square-toggle-luminosity-off-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-luminosity-on.png => square-toggle-luminosity-on-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-red-off.png => square-toggle-red-off-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-red-on.png => square-toggle-red-on-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-theme-off.png => square-toggle-theme-off-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-theme-on.png => square-toggle-theme-on-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-white-off.png => square-toggle-white-off-narrow.png} (100%) rename rtdata/images/themed/png/dark/{square-toggle-white-on.png => square-toggle-white-on-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-black-off.png => square-toggle-black-off-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-black-on.png => square-toggle-black-on-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-blue-off.png => square-toggle-blue-off-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-blue-on.png => square-toggle-blue-on-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-gray-off.png => square-toggle-gray-off-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-gray-on.png => square-toggle-gray-on-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-green-off.png => square-toggle-green-off-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-green-on.png => square-toggle-green-on-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-luminosity-off.png => square-toggle-luminosity-off-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-luminosity-on.png => square-toggle-luminosity-on-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-red-off.png => square-toggle-red-off-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-red-on.png => square-toggle-red-on-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-theme-off.png => square-toggle-theme-off-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-theme-on.png => square-toggle-theme-on-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-white-off.png => square-toggle-white-off-narrow.png} (100%) rename rtdata/images/themed/png/light/{square-toggle-white-on.png => square-toggle-white-on-narrow.png} (100%) rename rtdata/images/themed/svg/{square-toggle-black-off.svg => square-toggle-black-off-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-black-on.svg => square-toggle-black-on-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-blue-off.svg => square-toggle-blue-off-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-blue-on.svg => square-toggle-blue-on-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-gray-off.svg => square-toggle-gray-off-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-gray-on.svg => square-toggle-gray-on-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-green-off.svg => square-toggle-green-off-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-green-on.svg => square-toggle-green-on-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-luminosity-off.svg => square-toggle-luminosity-off-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-luminosity-on.svg => square-toggle-luminosity-on-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-red-off.svg => square-toggle-red-off-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-red-on.svg => square-toggle-red-on-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-theme-off.svg => square-toggle-theme-off-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-theme-on.svg => square-toggle-theme-on-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-white-off.svg => square-toggle-white-off-narrow.svg} (100%) rename rtdata/images/themed/svg/{square-toggle-white-on.svg => square-toggle-white-on-narrow.svg} (100%) diff --git a/rtdata/images/themed/png/dark/square-toggle-black-off.png b/rtdata/images/themed/png/dark/square-toggle-black-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-black-off.png rename to rtdata/images/themed/png/dark/square-toggle-black-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-black-on.png b/rtdata/images/themed/png/dark/square-toggle-black-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-black-on.png rename to rtdata/images/themed/png/dark/square-toggle-black-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-blue-off.png b/rtdata/images/themed/png/dark/square-toggle-blue-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-blue-off.png rename to rtdata/images/themed/png/dark/square-toggle-blue-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-blue-on.png b/rtdata/images/themed/png/dark/square-toggle-blue-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-blue-on.png rename to rtdata/images/themed/png/dark/square-toggle-blue-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-gray-off.png b/rtdata/images/themed/png/dark/square-toggle-gray-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-gray-off.png rename to rtdata/images/themed/png/dark/square-toggle-gray-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-gray-on.png b/rtdata/images/themed/png/dark/square-toggle-gray-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-gray-on.png rename to rtdata/images/themed/png/dark/square-toggle-gray-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-green-off.png b/rtdata/images/themed/png/dark/square-toggle-green-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-green-off.png rename to rtdata/images/themed/png/dark/square-toggle-green-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-green-on.png b/rtdata/images/themed/png/dark/square-toggle-green-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-green-on.png rename to rtdata/images/themed/png/dark/square-toggle-green-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-luminosity-off.png b/rtdata/images/themed/png/dark/square-toggle-luminosity-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-luminosity-off.png rename to rtdata/images/themed/png/dark/square-toggle-luminosity-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-luminosity-on.png b/rtdata/images/themed/png/dark/square-toggle-luminosity-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-luminosity-on.png rename to rtdata/images/themed/png/dark/square-toggle-luminosity-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-red-off.png b/rtdata/images/themed/png/dark/square-toggle-red-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-red-off.png rename to rtdata/images/themed/png/dark/square-toggle-red-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-red-on.png b/rtdata/images/themed/png/dark/square-toggle-red-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-red-on.png rename to rtdata/images/themed/png/dark/square-toggle-red-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-theme-off.png b/rtdata/images/themed/png/dark/square-toggle-theme-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-theme-off.png rename to rtdata/images/themed/png/dark/square-toggle-theme-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-theme-on.png b/rtdata/images/themed/png/dark/square-toggle-theme-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-theme-on.png rename to rtdata/images/themed/png/dark/square-toggle-theme-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-white-off.png b/rtdata/images/themed/png/dark/square-toggle-white-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-white-off.png rename to rtdata/images/themed/png/dark/square-toggle-white-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-white-on.png b/rtdata/images/themed/png/dark/square-toggle-white-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-white-on.png rename to rtdata/images/themed/png/dark/square-toggle-white-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-black-off.png b/rtdata/images/themed/png/light/square-toggle-black-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-black-off.png rename to rtdata/images/themed/png/light/square-toggle-black-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-black-on.png b/rtdata/images/themed/png/light/square-toggle-black-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-black-on.png rename to rtdata/images/themed/png/light/square-toggle-black-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-blue-off.png b/rtdata/images/themed/png/light/square-toggle-blue-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-blue-off.png rename to rtdata/images/themed/png/light/square-toggle-blue-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-blue-on.png b/rtdata/images/themed/png/light/square-toggle-blue-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-blue-on.png rename to rtdata/images/themed/png/light/square-toggle-blue-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-gray-off.png b/rtdata/images/themed/png/light/square-toggle-gray-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-gray-off.png rename to rtdata/images/themed/png/light/square-toggle-gray-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-gray-on.png b/rtdata/images/themed/png/light/square-toggle-gray-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-gray-on.png rename to rtdata/images/themed/png/light/square-toggle-gray-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-green-off.png b/rtdata/images/themed/png/light/square-toggle-green-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-green-off.png rename to rtdata/images/themed/png/light/square-toggle-green-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-green-on.png b/rtdata/images/themed/png/light/square-toggle-green-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-green-on.png rename to rtdata/images/themed/png/light/square-toggle-green-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-luminosity-off.png b/rtdata/images/themed/png/light/square-toggle-luminosity-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-luminosity-off.png rename to rtdata/images/themed/png/light/square-toggle-luminosity-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-luminosity-on.png b/rtdata/images/themed/png/light/square-toggle-luminosity-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-luminosity-on.png rename to rtdata/images/themed/png/light/square-toggle-luminosity-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-red-off.png b/rtdata/images/themed/png/light/square-toggle-red-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-red-off.png rename to rtdata/images/themed/png/light/square-toggle-red-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-red-on.png b/rtdata/images/themed/png/light/square-toggle-red-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-red-on.png rename to rtdata/images/themed/png/light/square-toggle-red-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-theme-off.png b/rtdata/images/themed/png/light/square-toggle-theme-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-theme-off.png rename to rtdata/images/themed/png/light/square-toggle-theme-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-theme-on.png b/rtdata/images/themed/png/light/square-toggle-theme-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-theme-on.png rename to rtdata/images/themed/png/light/square-toggle-theme-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-white-off.png b/rtdata/images/themed/png/light/square-toggle-white-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-white-off.png rename to rtdata/images/themed/png/light/square-toggle-white-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-white-on.png b/rtdata/images/themed/png/light/square-toggle-white-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-white-on.png rename to rtdata/images/themed/png/light/square-toggle-white-on-narrow.png diff --git a/rtdata/images/themed/svg/square-toggle-black-off.svg b/rtdata/images/themed/svg/square-toggle-black-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-black-off.svg rename to rtdata/images/themed/svg/square-toggle-black-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-black-on.svg b/rtdata/images/themed/svg/square-toggle-black-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-black-on.svg rename to rtdata/images/themed/svg/square-toggle-black-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-blue-off.svg b/rtdata/images/themed/svg/square-toggle-blue-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-blue-off.svg rename to rtdata/images/themed/svg/square-toggle-blue-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-blue-on.svg b/rtdata/images/themed/svg/square-toggle-blue-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-blue-on.svg rename to rtdata/images/themed/svg/square-toggle-blue-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-gray-off.svg b/rtdata/images/themed/svg/square-toggle-gray-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-gray-off.svg rename to rtdata/images/themed/svg/square-toggle-gray-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-gray-on.svg b/rtdata/images/themed/svg/square-toggle-gray-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-gray-on.svg rename to rtdata/images/themed/svg/square-toggle-gray-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-green-off.svg b/rtdata/images/themed/svg/square-toggle-green-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-green-off.svg rename to rtdata/images/themed/svg/square-toggle-green-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-green-on.svg b/rtdata/images/themed/svg/square-toggle-green-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-green-on.svg rename to rtdata/images/themed/svg/square-toggle-green-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-luminosity-off.svg b/rtdata/images/themed/svg/square-toggle-luminosity-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-luminosity-off.svg rename to rtdata/images/themed/svg/square-toggle-luminosity-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-luminosity-on.svg b/rtdata/images/themed/svg/square-toggle-luminosity-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-luminosity-on.svg rename to rtdata/images/themed/svg/square-toggle-luminosity-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-red-off.svg b/rtdata/images/themed/svg/square-toggle-red-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-red-off.svg rename to rtdata/images/themed/svg/square-toggle-red-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-red-on.svg b/rtdata/images/themed/svg/square-toggle-red-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-red-on.svg rename to rtdata/images/themed/svg/square-toggle-red-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-theme-off.svg b/rtdata/images/themed/svg/square-toggle-theme-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-theme-off.svg rename to rtdata/images/themed/svg/square-toggle-theme-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-theme-on.svg b/rtdata/images/themed/svg/square-toggle-theme-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-theme-on.svg rename to rtdata/images/themed/svg/square-toggle-theme-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-white-off.svg b/rtdata/images/themed/svg/square-toggle-white-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-white-off.svg rename to rtdata/images/themed/svg/square-toggle-white-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-white-on.svg b/rtdata/images/themed/svg/square-toggle-white-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-white-on.svg rename to rtdata/images/themed/svg/square-toggle-white-on-narrow.svg diff --git a/rtgui/previewmodepanel.cc b/rtgui/previewmodepanel.cc index 4b821f298..086f6ab17 100644 --- a/rtgui/previewmodepanel.cc +++ b/rtgui/previewmodepanel.cc @@ -24,23 +24,23 @@ PreviewModePanel::PreviewModePanel (ImageArea* ia) : imageArea(ia) { - iR = new RTImage ("square-toggle-red-on.png"); - iG = new RTImage ("square-toggle-green-on.png"); - iB = new RTImage ("square-toggle-blue-on.png"); - iL = new RTImage ("square-toggle-luminosity-on.png"); - iBC0 = new RTImage ("square-toggle-theme-on.png"); - iBC1 = new RTImage ("square-toggle-black-on.png"); - iBC2 = new RTImage ("square-toggle-white-on.png"); - iBC3 = new RTImage ("square-toggle-gray-on.png"); + iR = new RTImage ("square-toggle-red-on-narrow.png"); + iG = new RTImage ("square-toggle-green-on-narrow.png"); + iB = new RTImage ("square-toggle-blue-on-narrow.png"); + iL = new RTImage ("square-toggle-luminosity-on-narrow.png"); + iBC0 = new RTImage ("square-toggle-theme-on-narrow.png"); + iBC1 = new RTImage ("square-toggle-black-on-narrow.png"); + iBC2 = new RTImage ("square-toggle-white-on-narrow.png"); + iBC3 = new RTImage ("square-toggle-gray-on-narrow.png"); - igR = new RTImage ("square-toggle-red-off.png"); - igG = new RTImage ("square-toggle-green-off.png"); - igB = new RTImage ("square-toggle-blue-off.png"); - igL = new RTImage ("square-toggle-luminosity-off.png"); - igBC0 = new RTImage ("square-toggle-theme-off.png"); - igBC1 = new RTImage ("square-toggle-black-off.png"); - igBC2 = new RTImage ("square-toggle-white-off.png"); - igBC3 = new RTImage ("square-toggle-gray-off.png"); + igR = new RTImage ("square-toggle-red-off-narrow.png"); + igG = new RTImage ("square-toggle-green-off-narrow.png"); + igB = new RTImage ("square-toggle-blue-off-narrow.png"); + igL = new RTImage ("square-toggle-luminosity-off-narrow.png"); + igBC0 = new RTImage ("square-toggle-theme-off-narrow.png"); + igBC1 = new RTImage ("square-toggle-black-off-narrow.png"); + igBC2 = new RTImage ("square-toggle-white-off-narrow.png"); + igBC3 = new RTImage ("square-toggle-gray-off-narrow.png"); backColor0 = Gtk::manage (new Gtk::ToggleButton ()); backColor0->get_style_context()->add_class("narrowbutton"); From d831e6fbf2557c913534acb419499527dc725fc1 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 14 Aug 2018 00:46:40 +0200 Subject: [PATCH 15/33] Icon tweaks - Added missing icons, closes #4730 - Added high-contrast for cursors. --- rtdata/images/non-themed/png/empty.png | Bin 0 -> 81 bytes .../png/dark/color-picker-add-hicontrast.png | Bin 0 -> 639 bytes .../png/dark/color-picker-hicontrast.png | Bin 0 -> 628 bytes ...crosshair.png => crosshair-hicontrast.png} | Bin ...-closed.png => hand-closed-hicontrast.png} | Bin .../png/dark/node-move-x-hicontrast.png | Bin 0 -> 489 bytes .../png/dark/node-move-xy-hicontrast.png | Bin 0 -> 524 bytes .../png/dark/node-move-y-hicontrast.png | Bin 0 -> 469 bytes .../png/dark/rotate-aroundnode-hicontrast.png | Bin 0 -> 786 bytes .../themed/png/dark/rotate-aroundnode.png | Bin 0 -> 540 bytes .../png/light/color-picker-add-hicontrast.png | Bin 0 -> 639 bytes .../png/light/color-picker-hicontrast.png | Bin 0 -> 628 bytes ...crosshair.png => crosshair-hicontrast.png} | Bin ...-closed.png => hand-closed-hicontrast.png} | Bin .../png/light/node-move-x-hicontrast.png | Bin 0 -> 489 bytes .../png/light/node-move-xy-hicontrast.png | Bin 0 -> 524 bytes .../png/light/node-move-y-hicontrast.png | Bin 0 -> 469 bytes .../light/rotate-aroundnode-hicontrast.png | Bin 0 -> 786 bytes .../themed/png/light/rotate-aroundnode.png | Bin 0 -> 544 bytes .../svg/color-picker-add-hicontrast.svg | 142 ++++++++++++++++++ .../themed/svg/color-picker-hicontrast.svg | 137 +++++++++++++++++ ...crosshair.svg => crosshair-hicontrast.svg} | 0 ...-closed.svg => hand-closed-hicontrast.svg} | 0 .../themed/svg/node-move-x-hicontrast.svg | 120 +++++++++++++++ .../themed/svg/node-move-xy-hicontrast.svg | 130 ++++++++++++++++ .../themed/svg/node-move-y-hicontrast.svg | 120 +++++++++++++++ .../svg/rotate-aroundnode-hicontrast.svg | 118 +++++++++++++++ .../images/themed/svg/rotate-aroundnode.svg | 136 +++++++++++++++++ rtgui/cursormanager.cc | 16 +- 29 files changed, 911 insertions(+), 8 deletions(-) create mode 100644 rtdata/images/non-themed/png/empty.png create mode 100644 rtdata/images/themed/png/dark/color-picker-add-hicontrast.png create mode 100644 rtdata/images/themed/png/dark/color-picker-hicontrast.png rename rtdata/images/themed/png/dark/{crosshair.png => crosshair-hicontrast.png} (100%) rename rtdata/images/themed/png/dark/{hand-closed.png => hand-closed-hicontrast.png} (100%) create mode 100644 rtdata/images/themed/png/dark/node-move-x-hicontrast.png create mode 100644 rtdata/images/themed/png/dark/node-move-xy-hicontrast.png create mode 100644 rtdata/images/themed/png/dark/node-move-y-hicontrast.png create mode 100644 rtdata/images/themed/png/dark/rotate-aroundnode-hicontrast.png create mode 100644 rtdata/images/themed/png/dark/rotate-aroundnode.png create mode 100644 rtdata/images/themed/png/light/color-picker-add-hicontrast.png create mode 100644 rtdata/images/themed/png/light/color-picker-hicontrast.png rename rtdata/images/themed/png/light/{crosshair.png => crosshair-hicontrast.png} (100%) rename rtdata/images/themed/png/light/{hand-closed.png => hand-closed-hicontrast.png} (100%) create mode 100644 rtdata/images/themed/png/light/node-move-x-hicontrast.png create mode 100644 rtdata/images/themed/png/light/node-move-xy-hicontrast.png create mode 100644 rtdata/images/themed/png/light/node-move-y-hicontrast.png create mode 100644 rtdata/images/themed/png/light/rotate-aroundnode-hicontrast.png create mode 100644 rtdata/images/themed/png/light/rotate-aroundnode.png create mode 100644 rtdata/images/themed/svg/color-picker-add-hicontrast.svg create mode 100644 rtdata/images/themed/svg/color-picker-hicontrast.svg rename rtdata/images/themed/svg/{crosshair.svg => crosshair-hicontrast.svg} (100%) rename rtdata/images/themed/svg/{hand-closed.svg => hand-closed-hicontrast.svg} (100%) create mode 100644 rtdata/images/themed/svg/node-move-x-hicontrast.svg create mode 100644 rtdata/images/themed/svg/node-move-xy-hicontrast.svg create mode 100644 rtdata/images/themed/svg/node-move-y-hicontrast.svg create mode 100644 rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg create mode 100644 rtdata/images/themed/svg/rotate-aroundnode.svg diff --git a/rtdata/images/non-themed/png/empty.png b/rtdata/images/non-themed/png/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..534ddcb72f7095c18e07739f7ee3be7747d667e7 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`G?JY5_^JdVFT$jAufHB9)o{v8Jw aL&GXYP6-A^wQydLCI(MeKbLh*2~7Z@suFns literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/color-picker-add-hicontrast.png b/rtdata/images/themed/png/dark/color-picker-add-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..53eaabf6036423321b4c4e9d66920b9c5cf903f9 GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}uL7~m7)>R#XjWNzQS{qp6@Kn5Hz zf&q}r$;k;M_wL;bmqKPtnl$O$xpNQ^CMG5yUq44jr_|KcuV263ym^y@g99k_|NsA6 zx9_gsunEX@baa%HlWS~jOh`xos!2&n5#ahC092$<666=mPZT|UneMo~-TZr^$_gbs$>I~xudy#t&ZtyQOcQ84-^}voh!SR(o VLWefL)Y=IOBTrX9mvv4FO#tih?I!>L literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/color-picker-hicontrast.png b/rtdata/images/themed/png/dark/color-picker-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..c2592a8b79451f3d9dfbce2f4e08ec7d54ab9df4 GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}uL65tc!>R#XjWL~{`6-Yt=Gcz+I z7y!B3w{HiMuCA^?a_`=~KoTeeBr(C)uV2rdI|mVWbaYBhO$D;W#Kd}fdS=X+0c8LG z|9|zG^>^>y=iuN-N=mwN?WUZZ9MJs6#zy~s)xSU$N+m&l!3=WuL-b?ry?AVMVZtAa z%O6(xl%&@&onrZQ*OCAJfoCC|%fc=~Pb# z^DHBaKmY&VlndV$`C*#*Nu}q8+e`x|I=fa(TI?(Nj{EtHpK||YUf1UZhjbSge&hR* z^-NqzWgh=rqi4PrHVJR-Em-OdtoJ26-nk`@ee1Uv?&nIpa$?oDEZ@3suWvdKX>%!$ z|CjZ{HLcorOfELAG4d>1rl%X3X6CPIsWC6unNQ`t(l*=pwS_$1yas8?KzA~Dy85}S Ib4q9e0G=k?X#fBK literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/crosshair.png b/rtdata/images/themed/png/dark/crosshair-hicontrast.png similarity index 100% rename from rtdata/images/themed/png/dark/crosshair.png rename to rtdata/images/themed/png/dark/crosshair-hicontrast.png diff --git a/rtdata/images/themed/png/dark/hand-closed.png b/rtdata/images/themed/png/dark/hand-closed-hicontrast.png similarity index 100% rename from rtdata/images/themed/png/dark/hand-closed.png rename to rtdata/images/themed/png/dark/hand-closed-hicontrast.png diff --git a/rtdata/images/themed/png/dark/node-move-x-hicontrast.png b/rtdata/images/themed/png/dark/node-move-x-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..92a1c49e2befb702f3c3555f7946b337c2d7b8bf GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}s_AK(+>>R#Z(&CSii!U7Zs4Gjg7 zY;0^m5&{-3TnJ<+D=YKx@F*%OW@csrx%~Y6K<@wl|G$0v_P0RoEl^0fB*-tA;c=4Y zx3q7JeEZ1vzvrVa-Fmgi z_xdKKJx`pQ1dOMZl|TPt5x%WC^t{CPN0JvLQa+>}7E@kmw18#8i2!lQ^)nofBs6gF xFb7&ZwtJ|Xm3z8aYWnh?`sYPQ`3g_*%bwW5BB^5dNDyctgQu&X%Q~loCIBnnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}s_6W|l#>R#XjWGX2sEn2jQjg5_k zg(WmJ6et1#+}zx}U=R}%1Ee!EGlAm&|NsB~{rlIiUuCDM9|Q6QN`m}?8PdM|`L zQJeSa{T1KVeVe4OSOt{p^K@|x(KtVK(rdnE1CG|Wy-v}w8{hw5C-gk&PQvUzSwAKf zKe&+jYjMz}-xA7MwW}0Ef*fYge7;QL$3dH#UnVcA_ufvZ+xw|?Nkvn|s=&{&43_H7 zPv6}(ln#?%TEQS9w82ixE|qCB1N)f=EC%hd=UBQz9PidFjDK7gd7zopr0M+}xO#lD@ literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/node-move-y-hicontrast.png b/rtdata/images/themed/png/dark/node-move-y-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..e2fc55da844ad4d8db37bbbceb44601e95aedb17 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}s_9N-h;>R#ZZtgOt<%^edH6A}^v zWH2%^GBGg$<$+-F;>El$@c;jRpvbpx-)f?7zW}oMN`m}?8NPh|_VwAf6h7^LEADSN zqJ6s?D3j#r;uxZFe(j{&Tn7v|oU1p6-ahy3|Nb(AZ$@bet#gmF^td?xVA#Aq+w0X! zqbTV|61KCSzGFF(y6us++v`0mr0N`I9KFgN_)$j9_>nAgU(>_g54-|8%ipqFOxdqz erCZmgu5SH|dB#MOW${4U7(8A5T-G@yGywqD2Bjqc literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/dark/rotate-aroundnode-hicontrast.png b/rtdata/images/themed/png/dark/rotate-aroundnode-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..d8929ac4229b246e64f30ae806cd2517a2c1e104 GIT binary patch literal 786 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}sVC%`Af_5c6>-@bhV^7#1pfFutO z4>vcrdw~x-J3EjoE-v2E(&FRe16KeMhjXu7xdLP}F);zj@bK^n6D9x^oIQKCw6ruc zGxO%noBI0t2M!##bLUQIXlO`Ch>(!b^5x6z?CjRBU;qC7dsbG~;NW0kVPOFQfrSef z@`8bgh{)r|kAV)`9o85FG}pK!$S?TWv$S)pcds%$7P#~Dj^a`A4(_liF34 z`|RO^XE&cc`}%e9vs=%eReoJP=h>VYTb^AmI{uu2fl<)Y#W6(VeCec@Wrq|5TGbUF zOqly-x0>79TX()5r3K*O4u4E@)f;(yRA!I!Gm?feFepcx@Jbr*$2|u+g__18QUjnDc_pM zCTDu!?*-P6yCy#mcqVm(@6F%rg^F@>+}didHmpsYyyEq;ldeKSudFgW1p+J*1P|wy?biy iHQmlxP3*wpzYLcSiqE|`@fs+RGkCiCxvXERK!`}5n0T@z;^_M8K-LVNdpB90(?ST-3xq9pFVvC49=Z92V|c; zdltxp3j)~?5r~>IFTXtl>J=yn@(X5Ye6~5BH%DH_WueKfz^YT)o7F!8J506g! z6qW{=xPu`IHy1DY!sv07lSx%#($py?4Izs;n47N)wVgPw<#5g=lT9o+nVqdIOX2w< z7Ut<2KQeVp)tJ*cDIirLK;zh41``IR8!WXv5B#2q*(~Y$;LtZo&FR^MNlJ5s*DP7m nA0Vc^KBVEv+ey4UEDQ{@ES0;wX8jTZx|+e$)z4*}Q$iB}j3&)^ literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/color-picker-add-hicontrast.png b/rtdata/images/themed/png/light/color-picker-add-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..53eaabf6036423321b4c4e9d66920b9c5cf903f9 GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}uL7~m7)>R#XjWNzQS{qp6@Kn5Hz zf&q}r$;k;M_wL;bmqKPtnl$O$xpNQ^CMG5yUq44jr_|KcuV263ym^y@g99k_|NsA6 zx9_gsunEX@baa%HlWS~jOh`xos!2&n5#ahC092$<666=mPZT|UneMo~-TZr^$_gbs$>I~xudy#t&ZtyQOcQ84-^}voh!SR(o VLWefL)Y=IOBTrX9mvv4FO#tih?I!>L literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/color-picker-hicontrast.png b/rtdata/images/themed/png/light/color-picker-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..c2592a8b79451f3d9dfbce2f4e08ec7d54ab9df4 GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}uL65tc!>R#XjWL~{`6-Yt=Gcz+I z7y!B3w{HiMuCA^?a_`=~KoTeeBr(C)uV2rdI|mVWbaYBhO$D;W#Kd}fdS=X+0c8LG z|9|zG^>^>y=iuN-N=mwN?WUZZ9MJs6#zy~s)xSU$N+m&l!3=WuL-b?ry?AVMVZtAa z%O6(xl%&@&onrZQ*OCAJfoCC|%fc=~Pb# z^DHBaKmY&VlndV$`C*#*Nu}q8+e`x|I=fa(TI?(Nj{EtHpK||YUf1UZhjbSge&hR* z^-NqzWgh=rqi4PrHVJR-Em-OdtoJ26-nk`@ee1Uv?&nIpa$?oDEZ@3suWvdKX>%!$ z|CjZ{HLcorOfELAG4d>1rl%X3X6CPIsWC6unNQ`t(l*=pwS_$1yas8?KzA~Dy85}S Ib4q9e0G=k?X#fBK literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/crosshair.png b/rtdata/images/themed/png/light/crosshair-hicontrast.png similarity index 100% rename from rtdata/images/themed/png/light/crosshair.png rename to rtdata/images/themed/png/light/crosshair-hicontrast.png diff --git a/rtdata/images/themed/png/light/hand-closed.png b/rtdata/images/themed/png/light/hand-closed-hicontrast.png similarity index 100% rename from rtdata/images/themed/png/light/hand-closed.png rename to rtdata/images/themed/png/light/hand-closed-hicontrast.png diff --git a/rtdata/images/themed/png/light/node-move-x-hicontrast.png b/rtdata/images/themed/png/light/node-move-x-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..92a1c49e2befb702f3c3555f7946b337c2d7b8bf GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}s_AK(+>>R#Z(&CSii!U7Zs4Gjg7 zY;0^m5&{-3TnJ<+D=YKx@F*%OW@csrx%~Y6K<@wl|G$0v_P0RoEl^0fB*-tA;c=4Y zx3q7JeEZ1vzvrVa-Fmgi z_xdKKJx`pQ1dOMZl|TPt5x%WC^t{CPN0JvLQa+>}7E@kmw18#8i2!lQ^)nofBs6gF xFb7&ZwtJ|Xm3z8aYWnh?`sYPQ`3g_*%bwW5BB^5dNDyctgQu&X%Q~loCIBnnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}s_6W|l#>R#XjWGX2sEn2jQjg5_k zg(WmJ6et1#+}zx}U=R}%1Ee!EGlAm&|NsB~{rlIiUuCDM9|Q6QN`m}?8PdM|`L zQJeSa{T1KVeVe4OSOt{p^K@|x(KtVK(rdnE1CG|Wy-v}w8{hw5C-gk&PQvUzSwAKf zKe&+jYjMz}-xA7MwW}0Ef*fYge7;QL$3dH#UnVcA_ufvZ+xw|?Nkvn|s=&{&43_H7 zPv6}(ln#?%TEQS9w82ixE|qCB1N)f=EC%hd=UBQz9PidFjDK7gd7zopr0M+}xO#lD@ literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/node-move-y-hicontrast.png b/rtdata/images/themed/png/light/node-move-y-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..e2fc55da844ad4d8db37bbbceb44601e95aedb17 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}s_9N-h;>R#ZZtgOt<%^edH6A}^v zWH2%^GBGg$<$+-F;>El$@c;jRpvbpx-)f?7zW}oMN`m}?8NPh|_VwAf6h7^LEADSN zqJ6s?D3j#r;uxZFe(j{&Tn7v|oU1p6-ahy3|Nb(AZ$@bet#gmF^td?xVA#Aq+w0X! zqbTV|61KCSzGFF(y6us++v`0mr0N`I9KFgN_)$j9_>nAgU(>_g54-|8%ipqFOxdqz erCZmgu5SH|dB#MOW${4U7(8A5T-G@yGywqD2Bjqc literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/png/light/rotate-aroundnode-hicontrast.png b/rtdata/images/themed/png/light/rotate-aroundnode-hicontrast.png new file mode 100644 index 0000000000000000000000000000000000000000..d8929ac4229b246e64f30ae806cd2517a2c1e104 GIT binary patch literal 786 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA1(mo)lsM-XR2F5XXOu8FJ1aPr zloVwqm6l}Y=jjG#Bo?JQ=4584DrA(D6jnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}sVC%`Af_5c6>-@bhV^7#1pfFutO z4>vcrdw~x-J3EjoE-v2E(&FRe16KeMhjXu7xdLP}F);zj@bK^n6D9x^oIQKCw6ruc zGxO%noBI0t2M!##bLUQIXlO`Ch>(!b^5x6z?CjRBU;qC7dsbG~;NW0kVPOFQfrSef z@`8bgh{)r|kAV)`9o85FG}pK!$S?TWv$S)pcds%$7P#~Dj^a`A4(_liF34 z`|RO^XE&cc`}%e9vs=%eReoJP=h>VYTb^AmI{uu2fl<)Y#W6(VeCec@Wrq|5TGbUF zOqly-x0>79TX()5r3K*O4u4E@)f;(yRA!I!Gm?feFepcx@Jbr*$2|u+g__18QUjnDc_pM zCTDu!?*-P6yCy#mcqVm(@6F%rg^F@>+}didHmpsYyyEq;ldeKSudFgW1p+J*1P|wy?biy iHQmlxP3*wpzYLcSiqE|`@fs+RGkCiCxvXnBy}7ANYP=o#oA4oPAKnl1}6-6gd+xhS&$WFSLOVtGhLYEfcAYN|qJa(lV!_B$IXpd!u!kH}&M2EHR8%s5q>PZ}s_7T^=&>R#ZZrKP2!qM`~0a0Y}6 zAvHBMm6es%)YRZ=6ph&hfhGu*1o;Is@GQI)ubPJHD(@=j+6xb{h0hE zchYy)9|v~K;C&}pRH(G0?s<6Q+DjQ%uQ>;A;CtUV$$16~_pIi*8XCWsdA2_*sHqQJ pptm5f>$u-raknR;XX<}2Y_?)OKV`x1&p;P5c)I$ztaD0e0s#3?!k7R6 literal 0 HcmV?d00001 diff --git a/rtdata/images/themed/svg/color-picker-add-hicontrast.svg b/rtdata/images/themed/svg/color-picker-add-hicontrast.svg new file mode 100644 index 000000000..3d51dd31f --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-add-hicontrast.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-picker-hicontrast.svg b/rtdata/images/themed/svg/color-picker-hicontrast.svg new file mode 100644 index 000000000..867f9730b --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-hicontrast.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crosshair.svg b/rtdata/images/themed/svg/crosshair-hicontrast.svg similarity index 100% rename from rtdata/images/themed/svg/crosshair.svg rename to rtdata/images/themed/svg/crosshair-hicontrast.svg diff --git a/rtdata/images/themed/svg/hand-closed.svg b/rtdata/images/themed/svg/hand-closed-hicontrast.svg similarity index 100% rename from rtdata/images/themed/svg/hand-closed.svg rename to rtdata/images/themed/svg/hand-closed-hicontrast.svg diff --git a/rtdata/images/themed/svg/node-move-x-hicontrast.svg b/rtdata/images/themed/svg/node-move-x-hicontrast.svg new file mode 100644 index 000000000..6e6079901 --- /dev/null +++ b/rtdata/images/themed/svg/node-move-x-hicontrast.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/node-move-xy-hicontrast.svg b/rtdata/images/themed/svg/node-move-xy-hicontrast.svg new file mode 100644 index 000000000..9c3915804 --- /dev/null +++ b/rtdata/images/themed/svg/node-move-xy-hicontrast.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/node-move-y-hicontrast.svg b/rtdata/images/themed/svg/node-move-y-hicontrast.svg new file mode 100644 index 000000000..fe7b285e7 --- /dev/null +++ b/rtdata/images/themed/svg/node-move-y-hicontrast.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg b/rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg new file mode 100644 index 000000000..fda645c55 --- /dev/null +++ b/rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-aroundnode.svg b/rtdata/images/themed/svg/rotate-aroundnode.svg new file mode 100644 index 000000000..67ac406fa --- /dev/null +++ b/rtdata/images/themed/svg/rotate-aroundnode.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtgui/cursormanager.cc b/rtgui/cursormanager.cc index d1973dcca..6c280ee8c 100644 --- a/rtgui/cursormanager.cc +++ b/rtgui/cursormanager.cc @@ -51,15 +51,15 @@ void CursorManager::init (Glib::RefPtr mainWindow) cAdd = Gdk::Cursor::create (display, Gdk::PLUS); cWait = Gdk::Cursor::create (display, Gdk::CLOCK); - Glib::RefPtr hand = RTImage::createFromFile ("crosshair.png"); - Glib::RefPtr close_hand = RTImage::createFromFile ("hand-closed.png"); - Glib::RefPtr wbpick = RTImage::createFromFile ("color-picker.png"); - Glib::RefPtr cpick = RTImage::createFromFile ("color-picker-add.png"); + Glib::RefPtr hand = RTImage::createFromFile ("crosshair-hicontrast.png"); + Glib::RefPtr close_hand = RTImage::createFromFile ("hand-closed-hicontrast.png"); + Glib::RefPtr wbpick = RTImage::createFromFile ("color-picker-hicontrast.png"); + Glib::RefPtr cpick = RTImage::createFromFile ("color-picker-add-hicontrast.png"); Glib::RefPtr empty = RTImage::createFromFile ("empty.png"); - Glib::RefPtr move2D = RTImage::createFromFile ("node-move-xy.png"); - Glib::RefPtr move1DH = RTImage::createFromFile ("node-move-x.png"); - Glib::RefPtr move1DV = RTImage::createFromFile ("node-move-y.png"); - Glib::RefPtr moveRotate = RTImage::createFromFile ("move-rotate.png"); + Glib::RefPtr move2D = RTImage::createFromFile ("node-move-xy-hicontrast.png"); + Glib::RefPtr move1DH = RTImage::createFromFile ("node-move-x-hicontrast.png"); + Glib::RefPtr move1DV = RTImage::createFromFile ("node-move-y-hicontrast.png"); + Glib::RefPtr moveRotate = RTImage::createFromFile ("rotate-aroundnode-hicontrast.png"); cHand = hand ? Gdk::Cursor::create (cAdd->get_display(), hand, 12, 12) : Gdk::Cursor::create (cAdd->get_display(), Gdk::HAND2); cClosedHand = close_hand ? Gdk::Cursor::create (cAdd->get_display(), close_hand, 12, 12) : Gdk::Cursor::create (cAdd->get_display(), Gdk::HAND2); From 584163fbaa9b3517b26cb551aa74fe22cbfd0e3c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 15 Aug 2018 19:27:37 +0200 Subject: [PATCH 16/33] Segfault when processing image in queue for fast export, fixes #4734 --- rtengine/ipresize.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index f9ff94ef9..b3275b2e4 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -373,6 +373,7 @@ float ImProcFunctions::resizeScale (const ProcParams* params, int fw, int fh, in } else { dScale = (double)params->resize.height / (double)refh; } + dScale = (dScale > 1.0 && !params->resize.allowUpscaling) ? 1.0 : dScale; break; From 9fb9aaeec2ffe3181918bae5bf5b7f24bcc5e628 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 16 Aug 2018 18:30:37 +0200 Subject: [PATCH 17/33] eahd_demosaic: sse2 code for convert_to_cielab_row(), #4727 --- rtengine/eahd_demosaic.cc | 68 ++++++++++++++++++++++++++++----------- rtengine/rawimagesource.h | 6 ++-- 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index 5f247378a..1e9883bfe 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -35,10 +35,40 @@ using namespace std; namespace rtengine { -inline void RawImageSource::convert_to_cielab_row (float* ar, float* ag, float* ab, float* oL, float* oa, float* ob) +inline void RawImageSource::convert_to_cielab_row (const LUTf &cache, const float* ar, const float* ag, const float* ab, float* oL, float* oa, float* ob) { - for (int j = 0; j < W; j++) { + int j = 0; +#ifdef __SSE2__ + vfloat lc00v = F2V(lc00); + vfloat lc01v = F2V(lc01); + vfloat lc02v = F2V(lc02); + vfloat lc10v = F2V(lc10); + vfloat lc11v = F2V(lc11); + vfloat lc12v = F2V(lc12); + vfloat lc20v = F2V(lc20); + vfloat lc21v = F2V(lc21); + vfloat lc22v = F2V(lc22); + vfloat c116v = F2V(116.f); + vfloat c200v = F2V(200.f); + vfloat c500v = F2V(500.f); + + for (; j < W - 3; j += 4) { + vfloat r = LVFU(ar[j]); + vfloat g = LVFU(ag[j]); + vfloat b = LVFU(ab[j]); + + vfloat x = lc00v * r + lc01v * g + lc02v * b; + vfloat y = lc10v * r + lc11v * g + lc12v * b; + vfloat z = lc20v * r + lc21v * g + lc22v * b; + + vfloat cy = cache[y]; + STVFU(oL[j], c116v * cy); + STVFU(oa[j], c500v * (cache[x] - cy)); + STVFU(ob[j], c200v * (cy - cache[z])); + } +#endif + for (; j < W; j++) { float r = ar[j]; float g = ag[j]; float b = ab[j]; @@ -47,14 +77,10 @@ inline void RawImageSource::convert_to_cielab_row (float* ar, float* ag, float* float y = lc10 * r + lc11 * g + lc12 * b; float z = lc20 * r + lc21 * g + lc22 * b; - if (y > threshold) { - oL[j] = cache[(int)y]; - } else { - oL[j] = float(903.3f * y / MAXVALF); - } - - oa[j] = 500.f * ((x > threshold ? cache[(int)x] : 7.787f * x / MAXVALF + 16.f / 116.f) - (y > threshold ? cache[(int)y] : 7.787f * y / MAXVALF + 16.f / 116.f)); - ob[j] = 200.f * ((y > threshold ? cache[(int)y] : 7.787f * y / MAXVALF + 16.f / 116.f) - (z > threshold ? cache[(int)z] : 7.787f * z / MAXVALF + 16.f / 116.f)); + float cy = cache[y]; + oL[j] = 116.f * cy; + oa[j] = 500.f * (cache[x] - cy); + ob[j] = 200.f * (cy - cache[z]); } } @@ -255,12 +281,16 @@ void RawImageSource::eahd_demosaic () lc21 = (0.019334 * imatrices.rgb_cam[1][0] + 0.119193 * imatrices.rgb_cam[1][1] + 0.950227 * imatrices.rgb_cam[1][2]) ;// / 1.088754; lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; - int maxindex = 3 * 65536; //2*65536 3 = avoid crash 3/2013 J.Desmis - cache = new float[maxindex]; + int maxindex = 65536; //2*65536 3 = avoid crash 3/2013 J.Desmis + LUTf cache(65536); + threshold = 0.008856 * MAXVALD; for (int i = 0; i < maxindex; i++) { - cache[i] = std::cbrt(double(i) / MAXVALD); + if(i <= threshold) + cache[i] = (7.787f / MAXVALF) * i + 16.f / 116.f; + else + cache[i] = std::cbrt(double(i) / MAXVALD); } // end of cielab preparation @@ -281,10 +311,10 @@ void RawImageSource::eahd_demosaic () interpolate_row_rb (rh[1], bh[1], gh[0], gh[1], gh[2], 1); interpolate_row_rb (rv[1], bv[1], gv[0], gv[1], gv[2], 1); - convert_to_cielab_row (rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0]); - convert_to_cielab_row (rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0]); - convert_to_cielab_row (rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1]); - convert_to_cielab_row (rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1]); + convert_to_cielab_row (cache, rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0]); + convert_to_cielab_row (cache, rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0]); + convert_to_cielab_row (cache, rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1]); + convert_to_cielab_row (cache, rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1]); for (int j = 0; j < W; j++) { homh[0][j] = 0; @@ -315,8 +345,8 @@ void RawImageSource::eahd_demosaic () interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], nullptr, i + 1); } - convert_to_cielab_row (rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3]); - convert_to_cielab_row (rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3]); + convert_to_cielab_row (cache, rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3]); + convert_to_cielab_row (cache, rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3]); for (int j = 0; j < W; j++) { homh[ipx][j] = 0; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 0c335b4ab..cc11ddbb0 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -240,9 +240,9 @@ protected: inline void convert_row_to_RGB (float* r, float* g, float* b, const float* const Y, const float* const I, const float* const Q, const int W); inline void convert_to_RGB (float &r, float &g, float &b, const float Y, const float I, const float Q); - inline void convert_to_cielab_row (float* ar, float* ag, float* ab, float* oL, float* oa, float* ob); - inline void interpolate_row_g (float* agh, float* agv, int i); - inline void interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i); + inline void convert_to_cielab_row (const LUTf &cache, const float* ar, const float* ag, const float* ab, float* oL, float* oa, float* ob); + inline void interpolate_row_g (float* agh, float* agv, int i); + inline void interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i); inline void interpolate_row_rb_mul_pp (const array2D &rawData, float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip); float* CA_correct_RT (const bool autoCA, const double cared, const double cablue, const double caautostrength, array2D &rawData, double *fitParamsTransfer, bool fitParamsIn, bool fitParamsOut, float * buffer, bool freeBuffer); From d6ca3d65aada2cdf1ba076e65c7fe59e98a25924 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 17 Aug 2018 15:30:36 +0200 Subject: [PATCH 18/33] catmull-rom: ensure that the curve evaluation is exact at the control points --- rtengine/diagonalcurves.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index 3955c8e01..fc65951fa 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -317,7 +317,10 @@ inline void catmull_rom_spline(int n_points, double c, d, A1_x, A1_y, A2_x, A2_y, A3_x, A3_y; double B1_x, B1_y, B2_x, B2_y, C_x, C_y; - for (i = 0; i < n_points; ++i) { + res_x.push_back(p1_x); + res_y.push_back(p1_y); + + for (i = 1; i < n_points-1; ++i) { t = t1 + space * i; c = (t1 - t)/(t1 - t0); @@ -353,6 +356,9 @@ inline void catmull_rom_spline(int n_points, res_x.push_back(C_x); res_y.push_back(C_y); } + + res_x.push_back(p2_x); + res_y.push_back(p2_y); } From ef57c5da004d75d74ee93efcfef7ac869baf9167 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 17 Aug 2018 15:52:55 +0200 Subject: [PATCH 19/33] catmull-rom: add special case for evaluating straight segments at 0 or 1 --- rtengine/diagonalcurves.cc | 65 ++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index fc65951fa..e3308d56c 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -320,41 +320,50 @@ inline void catmull_rom_spline(int n_points, res_x.push_back(p1_x); res_y.push_back(p1_y); - for (i = 1; i < n_points-1; ++i) { - t = t1 + space * i; + // special case, a segment at 0 or 1 is computed exactly + if (p1_y == p2_y && (p1_y == 0 || p1_y == 1)) { + for (i = 1; i < n_points-1; ++i) { + t = p1_x + space * i; + res_x.push_back(t); + res_y.push_back(p1_y); + } + } else { + for (i = 1; i < n_points-1; ++i) { + t = t1 + space * i; - c = (t1 - t)/(t1 - t0); - d = (t - t0)/(t1 - t0); - A1_x = c * p0_x + d * p1_x; - A1_y = c * p0_y + d * p1_y; + c = (t1 - t)/(t1 - t0); + d = (t - t0)/(t1 - t0); + A1_x = c * p0_x + d * p1_x; + A1_y = c * p0_y + d * p1_y; - c = (t2 - t)/(t2 - t1); - d = (t - t1)/(t2 - t1); - A2_x = c * p1_x + d * p2_x; - A2_y = c * p1_y + d * p2_y; + c = (t2 - t)/(t2 - t1); + d = (t - t1)/(t2 - t1); + A2_x = c * p1_x + d * p2_x; + A2_y = c * p1_y + d * p2_y; - c = (t3 - t)/(t3 - t2); - d = (t - t2)/(t3 - t2); - A3_x = c * p2_x + d * p3_x; - A3_y = c * p2_y + d * p3_y; + c = (t3 - t)/(t3 - t2); + d = (t - t2)/(t3 - t2); + A3_x = c * p2_x + d * p3_x; + A3_y = c * p2_y + d * p3_y; - c = (t2 - t)/(t2 - t0); - d = (t - t0)/(t2 - t0); - B1_x = c * A1_x + d * A2_x; - B1_y = c * A1_y + d * A2_y; + c = (t2 - t)/(t2 - t0); + d = (t - t0)/(t2 - t0); + B1_x = c * A1_x + d * A2_x; + B1_y = c * A1_y + d * A2_y; - c = (t3 - t)/(t3 - t1); - d = (t - t1)/(t3 - t1); - B2_x = c * A2_x + d * A3_x; - B2_y = c * A2_y + d * A3_y; + c = (t3 - t)/(t3 - t1); + d = (t - t1)/(t3 - t1); + B2_x = c * A2_x + d * A3_x; + B2_y = c * A2_y + d * A3_y; - c = (t2 - t)/(t2 - t1); - d = (t - t1)/(t2 - t1); - C_x = c * B1_x + d * B2_x; - C_y = c * B1_y + d * B2_y; + c = (t2 - t)/(t2 - t1); + d = (t - t1)/(t2 - t1); + C_x = c * B1_x + d * B2_x; + C_y = c * B1_y + d * B2_y; - res_x.push_back(C_x); - res_y.push_back(C_y); + res_x.push_back(C_x); + res_y.push_back(C_y); + } } res_x.push_back(p2_x); From 7d9caf04435562b6a7523510b6051f6155789dd3 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 17 Aug 2018 22:50:46 +0200 Subject: [PATCH 20/33] dcraw: update to 9.28, #4626 --- rtengine/dcraw.cc | 327 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 249 insertions(+), 78 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index b76484df5..127a2aeb8 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -30,7 +30,7 @@ /* dcraw.c -- Dave Coffin's raw photo decoder - Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net + Copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net This is a command-line ANSI C program to convert raw photos from any digital camera on any computer running any operating system. @@ -49,11 +49,11 @@ *If you have not modified dcraw.c in any way, a link to my homepage qualifies as "full source code". - $Revision: 1.477 $ - $Date: 2016/05/10 21:30:43 $ + $Revision: 1.478 $ + $Date: 2018/06/01 20:36:25 $ */ -#define DCRAW_VERSION "9.27" +#define DCRAW_VERSION "9.28" #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -2432,10 +2432,10 @@ void CLASS packed_load_raw() UINT64 bitbuf=0; bwide = raw_width * tiff_bps / 8; - bwide += bwide & load_flags >> 7; + bwide += bwide & load_flags >> 9; rbits = bwide * 8 - raw_width * tiff_bps; if (load_flags & 1) bwide = bwide * 16 / 15; - bite = 8 + (load_flags & 24); + bite = 8 + (load_flags & 56); half = (raw_height+1) >> 1; for (irow=0; irow < raw_height; irow++) { row = irow; @@ -2453,10 +2453,10 @@ void CLASS packed_load_raw() for (vbits -= tiff_bps; vbits < 0; vbits += bite) { bitbuf <<= bite; for (i=0; i < bite; i+=8) - bitbuf |= (unsigned) (fgetc(ifp) << i); + bitbuf |= ((UINT64) fgetc(ifp) << i); } val = bitbuf << (64-tiff_bps-vbits) >> (64-tiff_bps); - RAW(row,col ^ (load_flags >> 6 & 1)) = val; + RAW(row,col ^ (load_flags >> 6 & 3)) = val; if (load_flags & 1 && (col % 10) == 9 && fgetc(ifp) && row < height+top_margin && col < width+left_margin) derror(); } @@ -4334,7 +4334,7 @@ void CLASS crop_masked_pixels() load_raw == &CLASS sony_load_raw || (load_raw == &CLASS eight_bit_load_raw && strncmp(model,"DC2",3)) || load_raw == &CLASS kodak_262_load_raw || - (load_raw == &CLASS packed_load_raw && (load_flags & 32))) { + (load_raw == &CLASS packed_load_raw && (load_flags & 256))) { sides: mask[0][0] = mask[1][0] = top_margin; mask[0][2] = mask[1][2] = top_margin+height; @@ -5974,14 +5974,13 @@ int CLASS parse_tiff_ifd (int base) case 258: /* BitsPerSample */ case 61443: tiff_ifd[ifd].samples = len & 7; - tiff_ifd[ifd].bps = getint(type); + if ((tiff_ifd[ifd].bps = getint(type)) > 32) + tiff_ifd[ifd].bps = 8; if (tiff_bps < tiff_ifd[ifd].bps) tiff_bps = tiff_ifd[ifd].bps; break; case 61446: raw_height = 0; - if (tiff_ifd[ifd].bps > 12) break; - load_raw = &CLASS packed_load_raw; load_flags = get4() ? 24:80; break; case 259: /* Compression */ @@ -6548,6 +6547,7 @@ void CLASS apply_tiff() case 32767: if (tiff_ifd[raw].bytes == raw_width*raw_height) { tiff_bps = 12; + maximum = 4095; load_raw = &CLASS sony_arw2_load_raw; break; } if (tiff_ifd[raw].bytes*8 != raw_width*raw_height*tiff_bps) { @@ -6563,7 +6563,9 @@ void CLASS apply_tiff() if (!strncmp(make,"OLYMPUS",7) && tiff_ifd[raw].bytes*2 == raw_width*raw_height*3) load_flags = 24; - if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8) { + if (!strcmp(make,"SONY") && tiff_bps < 14 && + tiff_ifd[raw].bytes == raw_width*raw_height*2) + tiff_bps = 14; if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8) { load_flags = 81; tiff_bps = 12; } slr: @@ -6577,7 +6579,9 @@ void CLASS apply_tiff() load_raw = &CLASS packed_load_raw; break; } - case 14: load_flags = 0; + case 14: load_raw = &CLASS packed_load_raw; + if (tiff_ifd[raw].bytes*4 == raw_width*raw_height*7) break; + load_flags = 0; case 16: load_raw = &CLASS unpacked_load_raw; if (!strncmp(make,"OLYMPUS",7) && tiff_ifd[raw].bytes*7 > raw_width*raw_height) @@ -6594,6 +6598,9 @@ void CLASS apply_tiff() } // ------------------ } +// if (filters == 9 && tiff_ifd[raw].bytes*8 < raw_width*raw_height*tiff_bps) +// load_raw = &CLASS fuji_xtrans_load_raw; + break; case 6: case 7: case 99: load_raw = &CLASS lossless_jpeg_load_raw; break; @@ -7052,7 +7059,7 @@ void CLASS parse_fuji (int offset) FORC(36) xtrans_abs[0][35-c] = fgetc(ifp) & 3; } else if (tag == 0x2ff0) { FORC4 cam_mul[c ^ 1] = get2(); - } else if (tag == 0xc000) { + } else if (tag == 0xc000 && len > 20000) { c = order; order = 0x4949; while ((tag = get4()) > raw_width); @@ -7378,12 +7385,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6188,-1341,-890,-7168,14489,2937,-2640,3228,8483 } }, { "Canon EOS 5DS", 0, 0x3c96, { 6250,-711,-808,-5153,12794,2636,-1249,2198,5610 } }, + { "Canon EOS 5D Mark IV", 0, 0, + { 6446,-366,-864,-4436,12204,2513,-952,2496,6348 } }, { "Canon EOS 5D Mark III", 0, 0x3c80, { 6722,-635,-963,-4287,12460,2028,-908,2162,5668 } }, { "Canon EOS 5D Mark II", 0, 0x3cf0, { 4716,603,-830,-7798,15474,2480,-1496,1937,6651 } }, { "Canon EOS 5D", 0, 0xe6c, { 6347,-479,-972,-8297,15954,2480,-1968,2131,7649 } }, + { "Canon EOS 6D Mark II", 0, 0, + { 6875,-970,-932,-4691,12459,2501,-874,1953,5809 } }, { "Canon EOS 6D", 0, 0x3c82, { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, { "Canon EOS 7D Mark II", 0, 0x3510, @@ -7406,10 +7417,14 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6719,-994,-925,-4408,12426,2211,-887,2129,6051 } }, { "Canon EOS 70D", 0, 0x3bc7, { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, + { "Canon EOS 77D", 0, 0, + { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, { "Canon EOS 80D", 0, 0, { 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 } }, { "Canon EOS 100D", 0, 0x350f, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + { "Canon EOS 200D", 0, 0, + { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, { "Canon EOS 300D", 0, 0xfa0, { 8197,-2000,-1118,-6714,14335,2592,-2536,3178,8266 } }, { "Canon EOS 350D", 0, 0xfff, @@ -7432,6 +7447,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, { "Canon EOS 760D", 0, 0x350f, { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS 800D", 0, 0, + { 6970,-512,-968,-4425,12161,2553,-739,1982,5601 } }, { "Canon EOS 1000D", 0, 0xe43, { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, { "Canon EOS 1100D", 0, 0x3510, @@ -7440,8 +7457,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6461,-907,-882,-4300,12184,2378,-819,1944,5931 } }, { "Canon EOS 1300D", 0, 0x3510, { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { "Canon EOS 1500D", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { "Canon EOS 3000D", 0, 0, + { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { "Canon EOS M6", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { "Canon EOS M5", 0, 0, /* also M50 */ + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS M3", 0, 0, { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS M100", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS M10", 0, 0, { 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 } }, { "Canon EOS M", 0, 0, @@ -7486,6 +7513,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7474,-2301,-567,-4056,11456,2975,-222,716,4181 } }, { "Canon PowerShot G16", 0, 0, { 8020,-2687,-682,-3704,11879,2052,-965,1921,5556 } }, + { "Canon PowerShot G1 X Mark III", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon PowerShot G1 X", 0, 0, { 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 } }, { "Canon PowerShot G1", 0, 0, @@ -7504,6 +7533,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9877,-3775,-871,-7613,14807,3072,-1448,1305,7485 } }, { "Canon PowerShot G7 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, + { "Canon PowerShot G9 X Mark II", 0, 0, + { 10056,-4131,-944,-2576,11143,1625,-238,1294,5179 } }, { "Canon PowerShot G9 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G9", 0, 0, @@ -7598,6 +7629,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, { "Fujifilm F8", 0, 0, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, + { "Fujifilm GFX 50S", 0, 0, + { 11756,-4754,-874,-3056,11045,2305,-381,1457,6006 } }, { "Fujifilm S100FS", 514, 0, { 11521,-4355,-1065,-6524,13767,3058,-1466,1984,6045 } }, { "Fujifilm S1", 0, 0, @@ -7606,9 +7639,9 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, { "Fujifilm S20", 512, 0x3fff, { 11401,-4498,-1312,-5088,12751,2613,-838,1568,5941 } }, - { "Fujifilm S2Pro", 128, 0, + { "Fujifilm S2Pro", 128, 0xf15, { 12492,-4690,-1402,-7033,15423,1647,-1507,2111,7697 } }, - { "Fujifilm S3Pro", 0, 0, + { "Fujifilm S3Pro", 0, 0x3dff, { 11807,-4612,-1294,-8927,16968,1988,-2120,2741,8006 } }, { "Fujifilm S5Pro", 0, 0, { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, @@ -7642,7 +7675,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, { "Fujifilm HS10 HS11", 0, 0xf68, { 12440,-3954,-1183,-1123,9674,1708,-83,1614,4086 } }, - { "Fujifilm HS2", 0, 0, + { "Fujifilm HS2", 0, 0xfef, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, { "Fujifilm HS3", 0, 0, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, @@ -7650,6 +7683,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 12085,-4727,-953,-3257,11489,2002,-511,2046,4592 } }, { "Fujifilm F900EXR", 0, 0, { 12085,-4727,-953,-3257,11489,2002,-511,2046,4592 } }, + { "Fujifilm X100F", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm X100S", 0, 0, { 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 } }, { "Fujifilm X100T", 0, 0, @@ -7668,26 +7703,42 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-Pro2", 0, 0, { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-A10", 0, 0, + { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 } }, + { "Fujifilm X-A20", 0, 0, + { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 } }, { "Fujifilm X-A1", 0, 0, { 11086,-4555,-839,-3512,11310,2517,-815,1341,5940 } }, { "Fujifilm X-A2", 0, 0, { 10763,-4560,-917,-3346,11311,2322,-475,1135,5843 } }, + { "Fujifilm X-A3", 0, 0, + { 12407,-5222,-1086,-2971,11116,2120,-294,1029,5284 } }, + { "Fujifilm X-A5", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, { "Fujifilm X-E1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-E2S", 0, 0, { 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 } }, { "Fujifilm X-E2", 0, 0, { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { "Fujifilm X-E3", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-H1", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm X-M1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-S1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, { "Fujifilm X-T1", 0, 0, /* also X-T10 */ { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { "Fujifilm X-T2", 0, 0, /* also X-T20 */ + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm XF1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, { "Fujifilm XQ", 0, 0, /* XQ1 and XQ2 */ { 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 } }, + { "GoPro HERO5 Black", 0, 0, + { 10344,-4210,-620,-2315,10625,1948,93,1058,5541 } }, { "Imacon Ixpress", 0, 0, /* DJC */ { 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } }, { "Kodak NC2000", 0, 0, @@ -7800,6 +7851,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7013,-1408,-635,-5268,12902,2640,-1470,2801,7379 } }, { "Nikon D3300", 0, 0, { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, + { "Nikon D3400", 0, 0, + { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D300", 0, 0, { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } }, { "Nikon D3X", 0, 0, @@ -7828,6 +7881,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D5500", 0, 0, { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, + { "Nikon D5600", 0, 0, + { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, { "Nikon D500", 0, 0, { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, { "Nikon D50", 0, 0, @@ -7846,12 +7901,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, { "Nikon D7200", 0, 0, { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, + { "Nikon D7500", 0, 0, + { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, { "Nikon D750", 0, 0, { 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 } }, { "Nikon D700", 0, 0, { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } }, { "Nikon D70", 0, 0, { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, + { "Nikon D850", 0, 0, + { 10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785 } }, { "Nikon D810", 0, 0, { 9369,-3195,-791,-4488,12430,2301,-893,1796,6872 } }, { "Nikon D800", 0, 0, @@ -7892,6 +7951,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7971,-2314,-913,-8451,15762,2894,-1442,1520,7610 } }, { "Nikon COOLPIX A", 0, 0, { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, + { "Nikon COOLPIX B700", 200, 0, + { 14387,-6014,-1299,-1357,9975,1616,467,1047,4744 } }, { "Nikon COOLPIX P330", 200, 0, { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, { "Nikon COOLPIX P340", 200, 0, @@ -7990,12 +8051,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus E-PL7", 0, 0, { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, + { "Olympus E-PL8", 0, 0, + { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, + { "Olympus E-PL9", 0, 0, + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus E-PM1", 0, 0, { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, { "Olympus E-PM2", 0, 0, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, - { "Olympus E-M10", 0, 0, /* also E-M10 Mark II */ + { "Olympus E-M10", 0, 0, /* also E-M10 Mark II & III */ { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus E-M1Mark II", 0, 0, + { 9383,-3170,-763,-2457,10702,2020,-384,1236,5552 } }, { "Olympus E-M1", 0, 0, { 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 } }, { "Olympus E-M5MarkII", 0, 0, @@ -8024,6 +8091,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8360,-2420,-880,-3928,12353,1739,-1381,2416,5173 } }, { "Olympus TG-4", 0, 0, { 11426,-4159,-1126,-2066,10678,1593,-120,1327,4998 } }, + { "Olympus TG-5", 0, 0, + { 10899,-3833,-1082,-2112,10736,1575,-267,1452,5269 } }, { "Olympus XZ-10", 0, 0, { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, { "Olympus XZ-1", 0, 0, @@ -8059,7 +8128,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { "Pentax K-r", 0, 0, { 9895,-3077,-850,-5304,13035,2521,-883,1768,6936 } }, { "Pentax K-1", 0, 0, - { 8566,-2746,-1201,-3612,12204,1550,-893,1680,6264 } }, + { 8596,-2981,-639,-4202,12046,2431,-685,1424,6122 } }, { "Pentax K-30", 0, 0, { 8710,-2632,-1167,-3995,12301,1881,-981,1719,6535 } }, { "Pentax K-3 II", 0, 0, @@ -8070,37 +8139,45 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8170,-2725,-639,-4440,12017,2744,-771,1465,6599 } }, { "Pentax K-5", 0, 0, { 8713,-2833,-743,-4342,11900,2772,-722,1543,6247 } }, + { "Pentax K-70", 0, 0, + { 8270,-2117,-1299,-4359,12953,1515,-1078,1933,5975 } }, { "Pentax K-7", 0, 0, { 9142,-2947,-678,-8648,16967,1663,-2224,2898,8615 } }, { "Pentax K-S1", 0, 0, { 8512,-3211,-787,-4167,11966,2487,-638,1288,6054 } }, { "Pentax K-S2", 0, 0, { 8662,-3280,-798,-3928,11771,2444,-586,1232,6054 } }, + { "Pentax KP", 0, 0, + { 8617,-3228,-1034,-4674,12821,2044,-803,1577,5728 } }, { "Pentax Q-S1", 0, 0, { 12995,-5593,-1107,-1879,10139,2027,-64,1233,4919 } }, { "Pentax 645D", 0, 0x3e00, { 10646,-3593,-1158,-3329,11699,1831,-667,2874,6287 } }, { "Panasonic DMC-CM1", 15, 0, { 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 } }, + { "Panasonic DC-FZ80", 0, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, { "Panasonic DMC-FZ8", 0, 0xf7f, { 8986,-2755,-802,-6341,13575,3077,-1476,2144,6379 } }, { "Panasonic DMC-FZ18", 0, 0, { 9932,-3060,-935,-5809,13331,2753,-1267,2155,5575 } }, { "Panasonic DMC-FZ28", 15, 0xf96, { 10109,-3488,-993,-5412,12812,2916,-1305,2140,5543 } }, + { "Panasonic DMC-FZ2500", 15, 0, + { 7386,-2443,-743,-3437,11864,1757,-608,1660,4766 } }, { "Panasonic DMC-FZ330", 15, 0, { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, { "Panasonic DMC-FZ300", 15, 0, { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, { "Panasonic DMC-FZ30", 0, 0xf94, { 10976,-4029,-1141,-7918,15491,2600,-1670,2071,8246 } }, - { "Panasonic DMC-FZ3", 15, 0, + { "Panasonic DMC-FZ3", 15, 0, /* FZ35, FZ38 */ { 9938,-2780,-890,-4604,12393,2480,-1117,2304,4620 } }, - { "Panasonic DMC-FZ4", 15, 0, + { "Panasonic DMC-FZ4", 15, 0, /* FZ40, FZ45 */ { 13639,-5535,-1371,-1698,9633,2430,316,1152,4108 } }, { "Panasonic DMC-FZ50", 0, 0, { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } }, - { "Panasonic DMC-FZ7", 15, 0, + { "Panasonic DMC-FZ7", 15, 0, /* FZ70, FZ72 */ { 11532,-4324,-1066,-2375,10847,1749,-564,1699,4351 } }, { "Leica V-LUX1", 0, 0, { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } }, @@ -8142,6 +8219,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } }, { "Leica D-LUX 6", 15, 0, { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } }, + { "Panasonic DMC-LX9", 15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, { "Panasonic DMC-FZ1000", 15, 0, { 7830,-2696,-763,-3325,11667,1866,-641,1712,4824 } }, { "Leica V-LUX (Typ 114)", 15, 0, @@ -8174,6 +8253,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8294,-2891,-651,-3869,11590,2595,-1183,2267,5352 } }, { "Panasonic DMC-G7", 15, 0xfff, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-G8", 15, 0xfff, /* G8, G80, G81, G85 */ + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DC-G9", 15, 0xfff, + { 7685,-2375,-634,-3687,11700,2249,-748,1546,5111 } }, { "Panasonic DMC-GF1", 15, 0xf92, { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } }, { "Panasonic DMC-GF2", 15, 0xfff, @@ -8188,6 +8271,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GF8", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DC-GF9", 15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GH1", 15, 0xf92, { 6299,-1466,-532,-6535,13852,2969,-2331,3112,5984 } }, { "Panasonic DMC-GH2", 15, 0xf95, @@ -8196,6 +8281,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 } }, { "Panasonic DMC-GH4", 15, 0, { 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 } }, + { "Panasonic DC-GH5S", 15, 0, + { 6929,-2355,-708,-4192,12534,1828,-1097,1989,5195 } }, + { "Panasonic DC-GH5", 15, 0, + { 7641,-2336,-605,-3218,11299,2187,-485,1338,5121 } }, { "Panasonic DMC-GM1", 15, 0, { 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 } }, { "Panasonic DMC-GM5", 15, 0, @@ -8204,24 +8293,26 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } }, { "Panasonic DMC-GX7", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-GX85", 15, 0, + { 7771,-3020,-629,-4029,11950,2345,-821,1977,6119 } }, { "Panasonic DMC-GX8", 15, 0, { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, - { "Panasonic DMC-TZ1", 15, 0, + { "Panasonic DC-GX9", 15, 0, + { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, + { "Panasonic DMC-ZS100", 15, 0, { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, - { "Panasonic DMC-ZS1", 15, 0, + { "Panasonic DC-ZS200", 15, 0, { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, - { "Panasonic DMC-TZ6", 15, 0, + { "Panasonic DMC-ZS40", 15, 0, { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, - { "Panasonic DMC-ZS4", 15, 0, - { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, - { "Panasonic DMC-TZ7", 15, 0, + { "Panasonic DMC-ZS50", 15, 0, { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, - { "Panasonic DMC-ZS5", 15, 0, - { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, - { "Panasonic DMC-TZ8", 15, 0, + { "Panasonic DMC-TZ82", 15, 0, { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, { "Panasonic DMC-ZS6", 15, 0, { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + { "Panasonic DMC-ZS70", 15, 0, + { 9052,-3117,-883,-3045,11346,1927,-205,1520,4730 } }, { "Leica S (Typ 007)", 0, 0, { 6063,-2234,-231,-5210,13787,1500,-1043,2866,6997 } }, { "Leica X", 0, 0, /* X and X-U, both (Typ 113) */ @@ -8231,7 +8322,15 @@ void CLASS adobe_coeff (const char *make, const char *model) { "Leica M (Typ 262)", 0, 0, { 6653,-1486,-611,-4221,13303,929,-881,2416,7226 } }, { "Leica SL (Typ 601)", 0, 0, - { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830} }, + { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { "Leica TL2", 0, 0, + { 5836,-1626,-647,-5384,13326,2261,-1207,2129,5861 } }, + { "Leica TL", 0, 0, + { 5463,-988,-364,-4634,12036,2946,-766,1389,6522 } }, + { "Leica CL", 0, 0, + { 7414,-2393,-840,-5127,13180,2138,-1585,2468,5064 } }, + { "Leica M10", 0, 0, + { 8249,-2849,-620,-5415,14756,565,-957,3074,6517 } }, { "Phase One H 20", 0, 0, /* DJC */ { 1313,1855,-109,-6715,15908,808,-327,1840,6020 } }, { "Phase One H 25", 0, 0, @@ -8302,16 +8401,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8512,-2641,-694,-8042,15670,2526,-1821,2117,7414 } }, { "Sony DSC-V3", 0, 0, { 7511,-2571,-692,-7894,15088,3060,-948,1111,8128 } }, - { "Sony DSC-RX100M", 0, 0, /* M2, M3, and M4 */ + { "Sony DSC-RX100M", 0, 0, /* M2, M3, M4, and M5 */ { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Sony DSC-RX100", 0, 0, { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, - { "Sony DSC-RX10", 0, 0, + { "Sony DSC-RX10M4", 0, 0, + { 7699,-2566,-629,-2967,11270,1928,-378,1286,4807 } }, + { "Sony DSC-RX10", 0, 0, /* also RX10M2, RX10M3 */ { 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 } }, { "Sony DSC-RX1RM2", 0, 0, { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, { "Sony DSC-RX1", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { "Sony DSC-RX0", 200, 0, + { 9396,-3507,-843,-2497,11111,1572,-343,1355,5089 } }, { "Sony DSLR-A100", 0, 0xfeb, { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, { "Sony DSLR-A290", 0, 0, @@ -8346,18 +8449,26 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6435,-1903,-536,-4722,12449,2550,-663,1363,6517 } }, { "Sony ILCA-77M2", 0, 0, { 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 } }, - { "Sony ILCE-6300", 0, 0, + { "Sony ILCA-99M2", 0, 0, + { 6660,-1918,-471,-4613,12398,2485,-649,1433,6447 } }, + { "Sony ILCE-6", 0, 0, /* 6300, 6500 */ { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, { "Sony ILCE-7M2", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, + { "Sony ILCE-7M3", 0, 0, + { 7374,-2389,-551,-5435,13162,2519,-1006,1795,6552 } }, { "Sony ILCE-7S", 0, 0, /* also ILCE-7SM2 */ { 5838,-1430,-246,-3497,11477,2297,-748,1885,5778 } }, + { "Sony ILCE-7RM3", 0, 0, + { 6640,-1847,-503,-5238,13010,2474,-993,1673,6527 } }, { "Sony ILCE-7RM2", 0, 0, { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, { "Sony ILCE-7R", 0, 0, { 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 } }, { "Sony ILCE-7", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, + { "Sony ILCE-9", 0, 0, + { 6389,-1703,-378,-4562,12265,2587,-670,1489,6550 } }, { "Sony ILCE", 0, 0, /* 3000, 5000, 5100, 6000, and QX1 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, { "Sony NEX-5N", 0, 0, @@ -8400,6 +8511,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, { "Sony SLT-A99", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { "YI M1", 0, 0, + { 7712,-2059,-653,-3882,11494,2726,-710,1332,5958 } }, }; double cam_xyz[4][3]; char name[130]; @@ -8582,8 +8695,11 @@ void CLASS identify() { 5712, 3774, 62, 20, 10, 2 }, { 5792, 3804, 158, 51, 0, 0 }, { 5920, 3950, 122, 80, 2, 0 }, + { 6096, 4051, 76, 35, 0, 0 }, { 6096, 4056, 72, 34, 0, 0 }, - { 6288, 4056, 264, 34, 0, 0 }, + { 6288, 4056, 264, 36, 0, 0 }, + { 6384, 4224, 120, 44, 0, 0 }, + { 6880, 4544, 136, 42, 0, 0 }, { 8896, 5920, 160, 64, 0, 0 }, }; static const struct { @@ -8597,7 +8713,10 @@ void CLASS identify() { 0x261, "EOS 50D" }, { 0x281, "EOS-1D Mark IV" }, { 0x287, "EOS 60D" }, { 0x167, "EOS-1DS" }, { 0x325, "EOS 70D" }, + { 0x408, "EOS 77D" }, { 0x331, "EOS M" }, { 0x350, "EOS 80D" }, { 0x328, "EOS-1D X Mark II" }, + { 0x346, "EOS 100D" }, + { 0x417, "EOS 200D" }, { 0x170, "EOS 300D" }, { 0x188, "EOS-1Ds Mark II" }, { 0x176, "EOS 450D" }, { 0x215, "EOS-1Ds Mark III" }, { 0x189, "EOS 350D" }, { 0x324, "EOS-1D C" }, @@ -8608,12 +8727,14 @@ void CLASS identify() { 0x301, "EOS 650D" }, { 0x302, "EOS 6D" }, { 0x326, "EOS 700D" }, { 0x250, "EOS 7D" }, { 0x393, "EOS 750D" }, { 0x289, "EOS 7D Mark II" }, - { 0x347, "EOS 760D" }, + { 0x347, "EOS 760D" }, { 0x406, "EOS 6D Mark II" }, + { 0x405, "EOS 800D" }, { 0x349, "EOS 5D Mark IV" }, { 0x254, "EOS 1000D" }, { 0x288, "EOS 1100D" }, - { 0x327, "EOS 1200D" }, { 0x382, "Canon EOS 5DS" }, - { 0x404, "EOS 1300D" }, { 0x401, "Canon EOS 5DS R" }, - { 0x346, "EOS 100D" }, + { 0x327, "EOS 1200D" }, { 0x382, "EOS 5DS" }, + { 0x404, "EOS 1300D" }, { 0x401, "EOS 5DS R" }, + { 0x422, "EOS 1500D" }, + { 0x432, "EOS 3000D" }, }, sonique[] = { { 0x002, "DSC-R1" }, { 0x100, "DSLR-A100" }, { 0x101, "DSLR-A900" }, { 0x102, "DSLR-A700" }, @@ -8643,7 +8764,30 @@ void CLASS identify() { 0x155, "DSC-RX100M4" },{ 0x156, "DSC-RX10M2" }, { 0x158, "DSC-RX1RM2" }, { 0x15a, "ILCE-QX1" }, { 0x15b, "ILCE-7RM2" }, { 0x15e, "ILCE-7SM2" }, - { 0x161, "ILCA-68" }, { 0x165, "ILCE-6300" }, + { 0x161, "ILCA-68" }, { 0x162, "ILCA-99M2" }, + { 0x163, "DSC-RX10M3" }, { 0x164, "DSC-RX100M5" }, + { 0x165, "ILCE-6300" }, { 0x166, "ILCE-9" }, + { 0x168, "ILCE-6500" }, { 0x16a, "ILCE-7RM3" }, + { 0x16b, "ILCE-7M3" }, { 0x16c, "DSC-RX0" }, + { 0x16d, "DSC-RX10M4" }, + }; + static const char *orig, panalias[][12] = { + "@DC-FZ80", "DC-FZ82", "DC-FZ85", + "@DC-FZ81", "DC-FZ83", + "@DC-GF9", "DC-GX800", "DC-GX850", + "@DC-GF10", "DC-GF90", + "@DC-GX9", "DC-GX7MK3", + "@DC-ZS70", "DC-TZ90", "DC-TZ91", "DC-TZ92", "DC-TZ93", + "@DMC-FZ40", "DMC-FZ45", + "@DMC-FZ2500", "DMC-FZ2000", "DMC-FZH1", + "@DMC-G8", "DMC-G80", "DMC-G81", "DMC-G85", + "@DMC-GX85", "DMC-GX80", "DMC-GX7MK2", + "@DMC-LX9", "DMC-LX10", "DMC-LX15", + "@DMC-ZS40", "DMC-TZ60", "DMC-TZ61", + "@DMC-ZS50", "DMC-TZ70", "DMC-TZ71", + "@DMC-ZS60", "DMC-TZ80", "DMC-TZ81", "DMC-TZ85", + "@DMC-ZS100", "DMC-ZS110", "DMC-TZ100", "DMC-TZ101", "DMC-TZ110", "DMC-TX1", + "@DC-ZS200", "DC-TX2", "DC-TZ200", "DC-TZ202", "DC-TZ220", "DC-ZS220", }; static const struct { unsigned fsize; @@ -8663,25 +8807,24 @@ void CLASS identify() { 15980544,3264,2448, 0, 0, 0, 0, 8,0x61,0,1,"AgfaPhoto","DC-833m" }, { 9631728,2532,1902, 0, 0, 0, 0,96,0x61,0,0,"Alcatel","5035D" }, { 2868726,1384,1036, 0, 0, 0, 0,64,0x49,0,8,"Baumer","TXG14",1078 }, - { 5298000,2400,1766,12,12,44, 2,40,0x94,0,2,"Canon","PowerShot SD300" }, - { 6553440,2664,1968, 4, 4,44, 4,40,0x94,0,2,"Canon","PowerShot A460" }, - { 6573120,2672,1968,12, 8,44, 0,40,0x94,0,2,"Canon","PowerShot A610" }, - { 6653280,2672,1992,10, 6,42, 2,40,0x94,0,2,"Canon","PowerShot A530" }, - { 7710960,2888,2136,44, 8, 4, 0,40,0x94,0,2,"Canon","PowerShot S3 IS" }, - { 9219600,3152,2340,36,12, 4, 0,40,0x94,0,2,"Canon","PowerShot A620" }, - { 9243240,3152,2346,12, 7,44,13,40,0x49,0,2,"Canon","PowerShot A470" }, - { 10341600,3336,2480, 6, 5,32, 3,40,0x94,0,2,"Canon","PowerShot A720 IS" }, - { 10383120,3344,2484,12, 6,44, 6,40,0x94,0,2,"Canon","PowerShot A630" }, - { 12945240,3736,2772,12, 6,52, 6,40,0x94,0,2,"Canon","PowerShot A640" }, - { 15636240,4104,3048,48,12,24,12,40,0x94,0,2,"Canon","PowerShot A650" }, - { 15467760,3720,2772, 6,12,30, 0,40,0x94,0,2,"Canon","PowerShot SX110 IS" }, - { 15534576,3728,2778,12, 9,44, 9,40,0x94,0,2,"Canon","PowerShot SX120 IS" }, - { 18653760,4080,3048,24,12,24,12,40,0x94,0,2,"Canon","PowerShot SX20 IS" }, - { 19131120,4168,3060,92,16, 4, 1,40,0x94,0,2,"Canon","PowerShot SX220 HS" }, - { 21936096,4464,3276,25,10,73,12,40,0x16,0,2,"Canon","PowerShot SX30 IS" }, - { 24724224,4704,3504, 8,16,56, 8,40,0x94,0,2,"Canon","PowerShot A3300 IS" }, - { 30858240,5248,3920, 8,16,56,16,40,0x94,0,2,"Canon","IXUS 160" }, - { 1976352,1632,1211, 0, 2, 0, 1, 0,0x94,0,1,"Casio","QV-2000UX" }, + { 5298000,2400,1766,12,12,44, 2, 8,0x94,0,2,"Canon","PowerShot SD300" }, + { 6553440,2664,1968, 4, 4,44, 4, 8,0x94,0,2,"Canon","PowerShot A460" }, + { 6573120,2672,1968,12, 8,44, 0, 8,0x94,0,2,"Canon","PowerShot A610" }, + { 6653280,2672,1992,10, 6,42, 2, 8,0x94,0,2,"Canon","PowerShot A530" }, + { 7710960,2888,2136,44, 8, 4, 0, 8,0x94,0,2,"Canon","PowerShot S3 IS" }, + { 9219600,3152,2340,36,12, 4, 0, 8,0x94,0,2,"Canon","PowerShot A620" }, + { 9243240,3152,2346,12, 7,44,13, 8,0x49,0,2,"Canon","PowerShot A470" }, + { 10341600,3336,2480, 6, 5,32, 3, 8,0x94,0,2,"Canon","PowerShot A720 IS" }, + { 10383120,3344,2484,12, 6,44, 6, 8,0x94,0,2,"Canon","PowerShot A630" }, + { 12945240,3736,2772,12, 6,52, 6, 8,0x94,0,2,"Canon","PowerShot A640" }, + { 15636240,4104,3048,48,12,24,12, 8,0x94,0,2,"Canon","PowerShot A650" }, + { 15467760,3720,2772, 6,12,30, 0, 8,0x94,0,2,"Canon","PowerShot SX110 IS" }, + { 15534576,3728,2778,12, 9,44, 9, 8,0x94,0,2,"Canon","PowerShot SX120 IS" }, + { 18653760,4080,3048,24,12,24,12, 8,0x94,0,2,"Canon","PowerShot SX20 IS" }, + { 19131120,4168,3060,92,16, 4, 1, 8,0x94,0,2,"Canon","PowerShot SX220 HS" }, + { 21936096,4464,3276,25,10,73,12, 8,0x16,0,2,"Canon","PowerShot SX30 IS" }, + { 24724224,4704,3504, 8,16,56, 8, 8,0x94,0,2,"Canon","PowerShot A3300 IS" }, + { 30858240,5248,3920, 8,16,56,16, 8,0x94,0,2,"Canon","IXUS 160" }, { 1976352,1632,1211, 0, 2, 0, 1, 0,0x94,0,1,"Casio","QV-2000UX" }, { 3217760,2080,1547, 0, 0,10, 1, 0,0x94,0,1,"Casio","QV-3*00EX" }, { 6218368,2585,1924, 0, 0, 9, 0, 0,0x94,0,1,"Casio","QV-5700" }, { 7816704,2867,2181, 0, 0,34,36, 0,0x16,0,1,"Casio","EX-Z60" }, @@ -8753,12 +8896,13 @@ void CLASS identify() { 44390468,4080,5440, 0, 0, 0, 0,33,0x61,0,0,"Sinar","",68 }, { 1409024,1376,1024, 0, 0, 1, 0, 0,0x49,0,0,"Sony","XCD-SX910CR" }, { 2818048,1376,1024, 0, 0, 1, 0,97,0x49,0,0,"Sony","XCD-SX910CR" }, + { 17496000,4320,3240, 0, 0, 0,0,224,0x94,0,0,"Xiro","Xplorer V" }, }; static const char *corp[] = { "AgfaPhoto", "Canon", "Casio", "Epson", "Fujifilm", "Mamiya", "Minolta", "Motorola", "Kodak", "Konica", "Leica", "Nikon", "Nokia", "Olympus", "Ricoh", "Pentax", "Phase One", - "Samsung", "Sigma", "Sinar", "Sony" }; + "Samsung", "Sigma", "Sinar", "Sony", "YI" }; char head[32], *cp; int hlen, flen, fsize, zero_fsize=1, i, c; struct jhead jh; @@ -8853,12 +8997,15 @@ void CLASS identify() if (is_raw == 2 && shot_select) parse_fuji (i); } - load_raw = &CLASS unpacked_load_raw; fseek (ifp, 100+28*(shot_select > 0 && shot_select < is_raw), SEEK_SET); parse_tiff (data_offset = get4()); parse_tiff (thumb_offset+12); /*RT*/ exif_base = thumb_offset+12; apply_tiff(); + if (!load_raw) { + load_raw = &CLASS unpacked_load_raw; + tiff_bps = 14; + } } else if (!memcmp (head,"RIFF",4)) { fseek (ifp, 0, SEEK_SET); parse_riff(); @@ -8957,7 +9104,8 @@ void CLASS identify() case 8: load_raw = &CLASS eight_bit_load_raw; break; case 10: case 12: - load_flags |= 128; + load_flags |= 512; + if (!strcmp(make,"Canon")) load_flags |= 256; load_raw = &CLASS packed_load_raw; break; case 16: order = 0x4949 | 0x404 * (load_flags & 1); @@ -9014,17 +9162,25 @@ void CLASS identify() { height = 2616; width = 3896; } if (height == 3136 && width == 4864) /* Pentax K20D and Samsung GX20 */ { height = 3124; width = 4688; filters = 0x16161616; } - if (width == 4352 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) + if (raw_height == 2868 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) /*RT*/ { width = 4308; filters = 0x16161616; } - if (width >= 4960 && !strncmp(model,"K-5",3)) - { left_margin = 10; width = 4950; filters = 0x16161616; } - if (width == 4736 && !strcmp(model,"K-7")) + if (raw_height == 3136 && !strcmp(model,"K-7")) { height = 3122; width = 4684; filters = 0x16161616; top_margin = 2; } - if (width == 6080 && !strcmp(model,"K-3")) - { left_margin = 4; width = 6040; } - if (width == 7424 && !strcmp(model,"645D")) - { height = 5502; width = 7328; filters = 0x61616161; top_margin = 29; - left_margin = 48; } + if (raw_height == 3284 && !strncmp(model,"K-5",3)) + { left_margin = 10; width = 4950; filters = 0x16161616; } + if (raw_height == 3300 && !strncmp(model,"K-50",4)) + { height = 3288, width = 4952; left_margin = 0; top_margin = 12; } + if (raw_height == 3664 && !strncmp(model,"K-S",3)) + { width = 5492; left_margin = 0; } + if (raw_height == 4032 && !strcmp(model,"K-3")) + { height = 4032; width = 6040; left_margin = 4; } + if (raw_height == 4060 && !strcmp(model,"KP")) + { height = 4032; width = 6032; left_margin = 52; top_margin = 28; } + if (raw_height == 4950 && !strcmp(model,"K-1")) + { height = 4932; width = 7380; left_margin = 4; top_margin = 18; } + if (raw_height == 5552 && !strcmp(model,"645D")) + { height = 5502; width = 7328; left_margin = 48; top_margin = 29; + filters = 0x61616161; } if (width == 7392 && !strncmp(model,"K-1",3)) { left_margin = 6; width = 7376; if(!dng_version) {top_margin = 18; height -= top_margin; }} if (width == 4832 && !strncmp(model,"K-1",3)) // K-1 APS-C format @@ -9074,6 +9230,10 @@ void CLASS identify() for (i=0; i < sizeof sonique / sizeof *sonique; i++) if (unique_id == sonique[i].id) strcpy (model, sonique[i].model); + for (i=0; i < sizeof panalias / sizeof *panalias; i++) + if (panalias[i][0] == '@') orig = panalias[i]+1; + else if (!strcmp(model,panalias[i])) + adobe_coeff ("Panasonic", orig); if (!strcmp(make,"Nikon")) { if (!load_raw) load_raw = &CLASS packed_load_raw; @@ -9160,7 +9320,7 @@ canon_a5: colors = 4; tiff_bps = 10; load_raw = &CLASS packed_load_raw; - load_flags = 40; + load_flags = 264; } else if (!strcmp(model,"PowerShot Pro90 IS") || !strcmp(model,"PowerShot G1")) { colors = 4; @@ -9172,6 +9332,9 @@ canon_a5: } else if (!strcmp(model,"EOS D2000C")) { filters = 0x61616161; black = curve[200]; + } else if (!strcmp(model,"EOS 80D")) { + top_margin -= 2; + height += 2; } else if (!strcmp(model,"D1")) { cam_mul[0] *= 256/527.0; cam_mul[2] *= 256/317.0; @@ -9226,6 +9389,8 @@ canon_a5: else width -= 8; } else if (!strncmp(model,"D300",4)) { width -= 32; + } else if (!strncmp(model,"COOLPIX B",9)) { + load_flags = 24; } else if (!strncmp(model,"COOLPIX P",9) && raw_width != 4032) { load_flags = 24; filters = 0x94949494; @@ -9298,8 +9463,7 @@ canon_a5: height = 2144; width = 2880; flip = 6; - } else if (load_raw != &CLASS packed_load_raw) - maximum = (is_raw == 2 && shot_select) ? 0x2f00 : 0x3e00; + } if (!strncmp(model,"X-A10",5)) { width = raw_width = 4912; height = raw_height = 3278; @@ -9310,7 +9474,7 @@ canon_a5: top_margin = (raw_height - height) >> 2 << 1; left_margin = (raw_width - width ) >> 2 << 1; if (width == 2848 || width == 3664) filters = 0x16161616; - if (width == 4032 || width == 4952 || width == 6032) left_margin = 0; + if (width == 4032 || width == 4952 || width == 6032 || width == 8280) left_margin = 0; if (width == 3328 && (width -= 66)) left_margin = 34; if (width == 4936) left_margin = 4; if (!strcmp(model,"HS50EXR") || @@ -9372,7 +9536,7 @@ konica_400z: } else if (!strcmp(make,"Samsung") && raw_width == 4704) { height -= top_margin = 8; width -= 2 * (left_margin = 8); - load_flags = 32; + load_flags = 256; } else if (!strcmp(make,"Samsung") && raw_height == 3714) { height -= top_margin = 18; left_margin = raw_width - (width = 5536); @@ -9444,6 +9608,11 @@ konica_400z: top_margin = 4; left_margin = 41; filters = 0x61616161; + } else if (raw_width == 8384) { + height = 6208; + width = 8280; + top_margin = 96; + left_margin = 46; } else if (raw_width == 6542) { // RT, H3D-31, H3DII-31, H4D-31 if (!strcmp(model, "H3D")) strcpy(model, "H3D-31"); if (!strcmp(model, "H4D")) strcpy(model, "H4D-31"); @@ -9586,6 +9755,8 @@ konica_400z: thumb_width = 640; } else if (!strcmp(model,"TG-4")) { width -= 16; + } else if (!strcmp(model,"TG-5")) { + width -= 6; } } else if (!strcmp(model,"N Digital")) { height = 2047; From 681aabd0e238f52e2211b9fe007b8f1e01ae5f69 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 18 Aug 2018 12:42:21 +0200 Subject: [PATCH 21/33] catmull-rom: use reflection to calculate the boundary control points --- rtengine/diagonalcurves.cc | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index e3308d56c..d543dd8f5 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -289,7 +289,7 @@ inline double catmull_rom_tj(double ti, double xi, double yi, double xj, double yj) { - static constexpr double alpha = 0.25; + static constexpr double alpha = 0.5; return pow(sqrt(pow2(xj-xi) + pow2(yj-yi)), alpha) + ti; } @@ -371,18 +371,23 @@ inline void catmull_rom_spline(int n_points, } +inline void catmull_rom_reflect(double px, double py, double cx, double cy, + double &rx, double &ry) +{ + double dx = px - cx; + double dy = py - cy; + rx = cx - dx; + ry = cy - dy; +} + + void catmull_rom_chain(int n_points, int n_cp, double *x, double *y, std::vector &res_x, std::vector &res_y) { - static const double epsilon = 1e-5; - double xr = x[1] - x[0]; - double yr = y[1] - y[0]; - double x_first = x[0] - xr * 0.01; - double y_first = xr > epsilon ? (yr / xr) * (x_first - x[0]) + y[0] : y[0]; - xr = x[n_cp-1] - x[n_cp-2]; - yr = y[n_cp-1] - x[n_cp-2]; - double x_last = x[n_cp-1] + xr * 0.01; - double y_last = xr > epsilon ? (yr / xr) * (x_last - x[n_cp-1]) + y[n_cp-1] : y[n_cp-1]; + double x_first, y_first; + double x_last, y_last; + catmull_rom_reflect(x[1], y[1], x[0], y[0], x_first, y_first); + catmull_rom_reflect(x[n_cp-2], y[n_cp-2], x[n_cp-1], y[n_cp-1], x_last, y_last); int segments = n_cp - 1; int points_segments = n_points / segments; From e3ea0926c22792edda2e4dffee3d59c9a7fb7c30 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 18 Aug 2018 12:43:14 +0200 Subject: [PATCH 22/33] catmull-rom: use uniform spacing of curve evaluation points --- rtengine/diagonalcurves.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index d543dd8f5..1af086925 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -390,13 +390,12 @@ void catmull_rom_chain(int n_points, int n_cp, double *x, double *y, catmull_rom_reflect(x[n_cp-2], y[n_cp-2], x[n_cp-1], y[n_cp-1], x_last, y_last); int segments = n_cp - 1; - int points_segments = n_points / segments; res_x.reserve(n_points); res_y.reserve(n_points); for (int i = 0; i < segments; ++i) { - int n = points_segments + (i == 0 ? n_points % segments : 0); + int n = max(int(n_points * (x[i+1] - x[i]) + 0.5), 2); catmull_rom_spline( n, i == 0 ? x_first : x[i-1], i == 0 ? y_first : y[i-1], x[i], y[i], x[i+1], y[i+1], From 4b2392e44ad08d6a923ecc66bf8d6c13f81f8481 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 18 Aug 2018 15:11:54 +0200 Subject: [PATCH 23/33] catmull-rom: make curves more rounded See https://github.com/Beep6581/RawTherapee/pull/4701#issuecomment-414054187 --- rtengine/diagonalcurves.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index 1af086925..f478ba719 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -289,7 +289,8 @@ inline double catmull_rom_tj(double ti, double xi, double yi, double xj, double yj) { - static constexpr double alpha = 0.5; + // see https://github.com/Beep6581/RawTherapee/pull/4701#issuecomment-414054187 + static constexpr double alpha = 0.375; return pow(sqrt(pow2(xj-xi) + pow2(yj-yi)), alpha) + ti; } @@ -374,10 +375,19 @@ inline void catmull_rom_spline(int n_points, inline void catmull_rom_reflect(double px, double py, double cx, double cy, double &rx, double &ry) { +#if 0 double dx = px - cx; double dy = py - cy; rx = cx - dx; ry = cy - dy; +#else + // see https://github.com/Beep6581/RawTherapee/pull/4701#issuecomment-414054187 + static constexpr double epsilon = 1e-5; + double dx = px - cx; + double dy = py - cy; + rx = cx - dx * 0.01; + ry = dx > epsilon ? (dy / dx) * (rx - cx) + cy : cy; +#endif } From d4894ef9485c44a930b1194ad41cb996fd197ebb Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 18 Aug 2018 16:15:32 +0200 Subject: [PATCH 24/33] eahd demosaic: convert rgb to Lab using Color::RGB2Lab() instead of duplicating code, #4727 --- rtengine/color.h | 2 + rtengine/eahd_demosaic.cc | 93 ++++++++------------------------------ rtengine/rawimagesource.cc | 20 -------- rtengine/rawimagesource.h | 6 --- 4 files changed, 20 insertions(+), 101 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index 33c170a69..1e6eef578 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -20,11 +20,13 @@ #pragma once #include +#include #include "rt_math.h" #include "LUT.h" #include "labimage.h" #include "iccmatrices.h" +#include "lcms2.h" #include "sleef.c" #define SAT(a,b,c) ((float)max(a,b,c)-(float)min(a,b,c))/(float)max(a,b,c) diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index 1e9883bfe..5f79bdbb0 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -19,6 +19,7 @@ */ #include +#include "color.h" #include "rawimagesource.h" #include "rawimagesource_i.h" #include "jaggedarray.h" @@ -35,54 +36,6 @@ using namespace std; namespace rtengine { -inline void RawImageSource::convert_to_cielab_row (const LUTf &cache, const float* ar, const float* ag, const float* ab, float* oL, float* oa, float* ob) -{ - - int j = 0; -#ifdef __SSE2__ - vfloat lc00v = F2V(lc00); - vfloat lc01v = F2V(lc01); - vfloat lc02v = F2V(lc02); - vfloat lc10v = F2V(lc10); - vfloat lc11v = F2V(lc11); - vfloat lc12v = F2V(lc12); - vfloat lc20v = F2V(lc20); - vfloat lc21v = F2V(lc21); - vfloat lc22v = F2V(lc22); - vfloat c116v = F2V(116.f); - vfloat c200v = F2V(200.f); - vfloat c500v = F2V(500.f); - - for (; j < W - 3; j += 4) { - vfloat r = LVFU(ar[j]); - vfloat g = LVFU(ag[j]); - vfloat b = LVFU(ab[j]); - - vfloat x = lc00v * r + lc01v * g + lc02v * b; - vfloat y = lc10v * r + lc11v * g + lc12v * b; - vfloat z = lc20v * r + lc21v * g + lc22v * b; - - vfloat cy = cache[y]; - STVFU(oL[j], c116v * cy); - STVFU(oa[j], c500v * (cache[x] - cy)); - STVFU(ob[j], c200v * (cy - cache[z])); - } -#endif - for (; j < W; j++) { - float r = ar[j]; - float g = ag[j]; - float b = ab[j]; - - float x = lc00 * r + lc01 * g + lc02 * b; - float y = lc10 * r + lc11 * g + lc12 * b; - float z = lc20 * r + lc21 * g + lc22 * b; - - float cy = cache[y]; - oL[j] = 116.f * cy; - oa[j] = 500.f * (cache[x] - cy); - ob[j] = 200.f * (cy - cache[z]); - } -} inline void RawImageSource::interpolate_row_g (float* agh, float* agv, int i) { @@ -267,31 +220,21 @@ void RawImageSource::eahd_demosaic () plistener->setProgress (0.0); } - // prepare cache and constants for cielab conversion + // prepare constants for cielab conversion //TODO: revisit after conversion to D50 illuminant - lc00 = (0.412453 * imatrices.rgb_cam[0][0] + 0.357580 * imatrices.rgb_cam[0][1] + 0.180423 * imatrices.rgb_cam[0][2]) ;// / 0.950456; - lc01 = (0.412453 * imatrices.rgb_cam[1][0] + 0.357580 * imatrices.rgb_cam[1][1] + 0.180423 * imatrices.rgb_cam[1][2]) ;// / 0.950456; - lc02 = (0.412453 * imatrices.rgb_cam[2][0] + 0.357580 * imatrices.rgb_cam[2][1] + 0.180423 * imatrices.rgb_cam[2][2]) ;// / 0.950456; + const float lc00 = (0.412453 * imatrices.rgb_cam[0][0] + 0.357580 * imatrices.rgb_cam[0][1] + 0.180423 * imatrices.rgb_cam[0][2]) ;// / 0.950456; + const float lc01 = (0.412453 * imatrices.rgb_cam[1][0] + 0.357580 * imatrices.rgb_cam[1][1] + 0.180423 * imatrices.rgb_cam[1][2]) ;// / 0.950456; + const float lc02 = (0.412453 * imatrices.rgb_cam[2][0] + 0.357580 * imatrices.rgb_cam[2][1] + 0.180423 * imatrices.rgb_cam[2][2]) ;// / 0.950456; - lc10 = 0.212671 * imatrices.rgb_cam[0][0] + 0.715160 * imatrices.rgb_cam[0][1] + 0.072169 * imatrices.rgb_cam[0][2]; - lc11 = 0.212671 * imatrices.rgb_cam[1][0] + 0.715160 * imatrices.rgb_cam[1][1] + 0.072169 * imatrices.rgb_cam[1][2]; - lc12 = 0.212671 * imatrices.rgb_cam[2][0] + 0.715160 * imatrices.rgb_cam[2][1] + 0.072169 * imatrices.rgb_cam[2][2]; + const float lc10 = 0.212671 * imatrices.rgb_cam[0][0] + 0.715160 * imatrices.rgb_cam[0][1] + 0.072169 * imatrices.rgb_cam[0][2]; + const float lc11 = 0.212671 * imatrices.rgb_cam[1][0] + 0.715160 * imatrices.rgb_cam[1][1] + 0.072169 * imatrices.rgb_cam[1][2]; + const float lc12 = 0.212671 * imatrices.rgb_cam[2][0] + 0.715160 * imatrices.rgb_cam[2][1] + 0.072169 * imatrices.rgb_cam[2][2]; - lc20 = (0.019334 * imatrices.rgb_cam[0][0] + 0.119193 * imatrices.rgb_cam[0][1] + 0.950227 * imatrices.rgb_cam[0][2]) ;// / 1.088754; - lc21 = (0.019334 * imatrices.rgb_cam[1][0] + 0.119193 * imatrices.rgb_cam[1][1] + 0.950227 * imatrices.rgb_cam[1][2]) ;// / 1.088754; - lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; + const float lc20 = (0.019334 * imatrices.rgb_cam[0][0] + 0.119193 * imatrices.rgb_cam[0][1] + 0.950227 * imatrices.rgb_cam[0][2]) ;// / 1.088754; + const float lc21 = (0.019334 * imatrices.rgb_cam[1][0] + 0.119193 * imatrices.rgb_cam[1][1] + 0.950227 * imatrices.rgb_cam[1][2]) ;// / 1.088754; + const float lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; - int maxindex = 65536; //2*65536 3 = avoid crash 3/2013 J.Desmis - LUTf cache(65536); - - threshold = 0.008856 * MAXVALD; - - for (int i = 0; i < maxindex; i++) { - if(i <= threshold) - cache[i] = (7.787f / MAXVALF) * i + 16.f / 116.f; - else - cache[i] = std::cbrt(double(i) / MAXVALD); - } + const float wp[3][3] = {{lc00, lc01, lc02}, {lc10, lc11, lc12}, {lc20, lc21, lc22}}; // end of cielab preparation @@ -311,10 +254,10 @@ void RawImageSource::eahd_demosaic () interpolate_row_rb (rh[1], bh[1], gh[0], gh[1], gh[2], 1); interpolate_row_rb (rv[1], bv[1], gv[0], gv[1], gv[2], 1); - convert_to_cielab_row (cache, rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0]); - convert_to_cielab_row (cache, rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0]); - convert_to_cielab_row (cache, rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1]); - convert_to_cielab_row (cache, rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1]); + Color::RGB2Lab(rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0], wp, W); + Color::RGB2Lab(rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0], wp, W); + Color::RGB2Lab(rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1], wp, W); + Color::RGB2Lab(rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1], wp, W); for (int j = 0; j < W; j++) { homh[0][j] = 0; @@ -345,8 +288,8 @@ void RawImageSource::eahd_demosaic () interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], nullptr, i + 1); } - convert_to_cielab_row (cache, rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3]); - convert_to_cielab_row (cache, rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3]); + Color::RGB2Lab(rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3], wp, W); + Color::RGB2Lab(rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3], wp, W); for (int j = 0; j < W; j++) { homh[ipx][j] = 0; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 8f85be13a..fb27098a6 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -448,17 +448,6 @@ RawImageSource::RawImageSource () , camInitialGain(0.0) , defGain(0.0) , ri(nullptr) - , lc00(0.0) - , lc01(0.0) - , lc02(0.0) - , lc10(0.0) - , lc11(0.0) - , lc12(0.0) - , lc20(0.0) - , lc21(0.0) - , lc22(0.0) - , cache(nullptr) - , threshold(0) , rawData(0, 0) , green(0, 0) , red(0, 0) @@ -491,10 +480,6 @@ RawImageSource::~RawImageSource () flushRGB(); flushRawData(); - if( cache ) { - delete [] cache; - } - if (camProfile) { cmsCloseProfile (camProfile); } @@ -2816,11 +2801,6 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara void RawImageSource::flushRawData() { - if(cache) { - delete [] cache; - cache = nullptr; - } - if (rawData) { rawData(0, 0); } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index cc11ddbb0..95c4dbe22 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -75,11 +75,6 @@ protected: unsigned int currFrame = 0; unsigned int numFrames = 0; - // to accelerate CIELAB conversion: - float lc00, lc01, lc02, lc10, lc11, lc12, lc20, lc21, lc22; - float* cache; - float threshold; - array2D rawData; // holds preprocessed pixel values, rowData[i][j] corresponds to the ith row and jth column array2D *rawDataFrames[4] = {nullptr}; array2D *rawDataBuffer[3] = {nullptr}; @@ -240,7 +235,6 @@ protected: inline void convert_row_to_RGB (float* r, float* g, float* b, const float* const Y, const float* const I, const float* const Q, const int W); inline void convert_to_RGB (float &r, float &g, float &b, const float Y, const float I, const float Q); - inline void convert_to_cielab_row (const LUTf &cache, const float* ar, const float* ag, const float* ab, float* oL, float* oa, float* ob); inline void interpolate_row_g (float* agh, float* agv, int i); inline void interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i); inline void interpolate_row_rb_mul_pp (const array2D &rawData, float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip); From ab79434beb3bbcc6c122b53e10401c52d3fec896 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 18 Aug 2018 18:46:39 +0200 Subject: [PATCH 25/33] Add tooltip for saving current pp3 to save button for default and Deutsch language file, no issue --- rtdata/languages/Deutsch | 2 +- rtdata/languages/default | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 4318514f2..e75756c4a 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -918,7 +918,7 @@ MAIN_BUTTON_NAVPREV_TOOLTIP;Navigiert zum vorherigen Miniaturbild in der\nDateiv 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: x\n\nWie oben, jedoch ohne Löschung aktiver Filter. Das\nMiniaturbild des geöffneten Bildes wird nicht angezeigt,\nwenn es herausgefiltert wurde.\nTaste: y MAIN_BUTTON_PREFERENCES;Einstellungen MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Bild zur Warteschlange hinzufügen\nTaste: Strg + b -MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern\nTaste: Strg + s +MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern\nTaste: Strg+s\nProfil (.pp3) speichern\nTaste: Strg+Shift+s MAIN_BUTTON_SENDTOEDITOR;Bild im externen Editor öffnen MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Bild im externen Editor öffnen\nTaste: Strg + e MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Alle seitlichen Bedienfelder ein-/ausblenden\nTaste: m diff --git a/rtdata/languages/default b/rtdata/languages/default index 55f2c451d..237c83ed6 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -851,7 +851,7 @@ MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image ope MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). MAIN_BUTTON_PREFERENCES;Preferences MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m From 34ecab6b45c59641a160fa1a0ce88a6ebfaf71ec Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 19 Aug 2018 01:50:13 +0200 Subject: [PATCH 26/33] Update Deutsch locale Tooltip correction --- rtdata/languages/Deutsch | 169 ++++++++++++++++++++------------------- 1 file changed, 85 insertions(+), 84 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index e75756c4a..e69bd8c57 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -68,6 +68,7 @@ #67 05.07.2018 Erweiterung (TooWaBoo) RT 5.4 #68 05.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 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -98,11 +99,11 @@ CURVEEDITOR_NURBS;NURBS-Kurve CURVEEDITOR_PARAMETRIC;Parametrisch CURVEEDITOR_SAVEDLGLABEL;Kurve speichern... CURVEEDITOR_SHADOWS;Schatten -CURVEEDITOR_TOOLTIPCOPY;Kurve in Zwischenablage kopieren -CURVEEDITOR_TOOLTIPLINEAR;Kurve zurücksetzen -CURVEEDITOR_TOOLTIPLOAD;Kurve laden -CURVEEDITOR_TOOLTIPPASTE;Kurve aus Zwischenablage einfügen -CURVEEDITOR_TOOLTIPSAVE;Kurve speichern +CURVEEDITOR_TOOLTIPCOPY;Kurve in Zwischenablage kopieren. +CURVEEDITOR_TOOLTIPLINEAR;Kurve zurücksetzen. +CURVEEDITOR_TOOLTIPLOAD;Kurve laden. +CURVEEDITOR_TOOLTIPPASTE;Kurve aus Zwischenablage einfügen. +CURVEEDITOR_TOOLTIPSAVE;Kurve speichern. CURVEEDITOR_TYPE;Typ: DIRBROWSER_FOLDERS;Ordner DONT_SHOW_AGAIN;Meldung nicht mehr anzeigen. @@ -116,7 +117,7 @@ DYNPROFILEEDITOR_NEW;Neu DYNPROFILEEDITOR_NEW_RULE;Profilregel erstellen DYNPROFILEEDITOR_PROFILE;Profil EDITWINDOW_TITLE;Bildbearbeitung -EDIT_OBJECT_TOOLTIP;Schaltet das Einstellungswerkzeug\nim Vorschaubild ein/aus +EDIT_OBJECT_TOOLTIP;Schaltet das Einstellungswerkzeug\nim Vorschaubild ein/aus. EDIT_PIPETTE_TOOLTIP;Um einen Punkt der Kurve hinzuzufügen, halten Sie die Strg-Taste gedrückt und klicken mit der linke Maustaste auf die gewünschte Stelle in der Vorschau.\nUm den Punkt anzupassen, halten Sie die Strg-Taste gedrückt und klicken Sie mit der linken Maustaste auf den entsprechenden Bereich in der Vorschau. Dann lassen Sie die Strg-Taste los (es sei denn, Sie möchten eine Feineinstellung vornehmen) und bewegen die Maus bei gedrückter linker Maustaste nach oben oder unten, um den Punkt auf der Kurve zu bewegen. EXIFFILTER_APERTURE;Blende EXIFFILTER_CAMERA;Kamera @@ -254,7 +255,7 @@ FILEBROWSER_SHOWCOLORLABEL5HINT;Nur violett markierte Bilder anzeigen\nTaste: d FILEBROWSER_SHOWEDITEDHINT;Nur bearbeitete Bilder anzeigen\nTaste: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Nur unbearbeitete Bilder anzeigen\nTaste: 6 -FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden\n\nIm Multi-Reitermodus:\nTaste: i\nIm Ein-Reitermodus:\nTaste: Alt + i +FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden.\n\nIm Multi-Reitermodus:\nTaste: i\nIm Ein-Reitermodus:\nTaste: Alt + i 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_SHOWRANK1HINT;Nur mit 1 Stern bewertete Bilder anzeigen\nTaste: 1 @@ -305,13 +306,14 @@ GENERAL_SLIDER;Regler GENERAL_UNCHANGED;(Unverändert) GENERAL_WARNING;Warnung GIMP_PLUGIN_INFO;Willkommen zum RawTherapee GIMP-Plugin!\nNach den Änderungen bitte das RawTherapee-Fenster schließen.\nDas Bild wird dann automatisch in GIMP importiert. -HISTOGRAM_TOOLTIP_B;Blau-Histogramm ein-/ausblenden -HISTOGRAM_TOOLTIP_BAR;RGB-Anzeigeleiste ein-/ausblenden\n\nZum Fixieren/Lösen der Anzeige muss mit der\nrechten Maustaste ins Bildfenster geklickt werden. -HISTOGRAM_TOOLTIP_CHRO;Chromatizität-Histogramm ein/ausblenden -HISTOGRAM_TOOLTIP_FULL;Skaliertes Histogramm ein/ausschalten -HISTOGRAM_TOOLTIP_G;Grün-Histogramm ein-/ausblenden -HISTOGRAM_TOOLTIP_L;CIELab-Luminanz-Histogramm ein-/ausblenden -HISTOGRAM_TOOLTIP_R;Rot-Histogramm ein-/ausblenden +HISTOGRAM_TOOLTIP_B;Blau-Histogramm ein-/ausblenden. +HISTOGRAM_TOOLTIP_BAR;RGB-Anzeigeleiste ein-/ausblenden. +HISTOGRAM_TOOLTIP_CHRO;Chromatizität-Histogramm ein/ausblenden. +HISTOGRAM_TOOLTIP_FULL;Skaliertes Histogramm ein/ausschalten. +HISTOGRAM_TOOLTIP_MODE;Schaltet zwischen linearer, logarithmischer-linearer und\nlogarithmischer-logarithmischer Skalierung um. +HISTOGRAM_TOOLTIP_G;Grün-Histogramm ein-/ausblenden. +HISTOGRAM_TOOLTIP_L;CIELab-Luminanz-Histogramm ein-/ausblenden. +HISTOGRAM_TOOLTIP_R;Rot-Histogramm ein-/ausblenden. HISTOGRAM_TOOLTIP_RAW;Zwischen normalen Histogrammen und\nRAW-Histogrammen umschalten. HISTORY_CHANGED;Geändert HISTORY_CUSTOMCURVE;Benutzerdefiniert @@ -917,12 +919,12 @@ MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigiert zum nächsten Miniaturbild in der\nDateive MAIN_BUTTON_NAVPREV_TOOLTIP;Navigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf das ausgewählte Miniaturbild.\nTaste: F3\n\nNavigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf auf das im Editor geöffnete Bild.\nTaste: Umschalt + F3 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: x\n\nWie oben, jedoch ohne Löschung aktiver Filter. Das\nMiniaturbild des geöffneten Bildes wird nicht angezeigt,\nwenn es herausgefiltert wurde.\nTaste: y MAIN_BUTTON_PREFERENCES;Einstellungen -MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Bild zur Warteschlange hinzufügen\nTaste: Strg + b -MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern\nTaste: Strg+s\nProfil (.pp3) speichern\nTaste: Strg+Shift+s +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Bild zur Warteschlange hinzufügen.\nTaste: Strg + b +MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern.\nTaste: Strg + s\nProfil (.pp3) speichern.\nTaste: Strg + Umschalt + s MAIN_BUTTON_SENDTOEDITOR;Bild im externen Editor öffnen -MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Bild im externen Editor öffnen\nTaste: Strg + e -MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Alle seitlichen Bedienfelder ein-/ausblenden\nTaste: m -MAIN_BUTTON_UNFULLSCREEN;Vollbild beenden\nTaste: F11 +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Bild im externen Editor öffnen.\nTaste: Strg + e +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Alle seitlichen Bedienfelder ein-/ausblenden.\nTaste: m +MAIN_BUTTON_UNFULLSCREEN;Vollbild beenden.\nTaste: F11 MAIN_FRAME_BATCHQUEUE;Warteschlange MAIN_FRAME_BATCHQUEUE_TOOLTIP;Warteschlange\nTaste: Strg + F3 MAIN_FRAME_EDITOR;Editor @@ -969,26 +971,26 @@ MAIN_TAB_TRANSFORM;Transformieren MAIN_TAB_TRANSFORM_TOOLTIP;Taste: Alt + t MAIN_TAB_WAVELET;Wavelet MAIN_TAB_WAVELET_TOOLTIP;Taste: Alt + w -MAIN_TOOLTIP_BACKCOLOR0;Hintergrundfarbe der Vorschau basierend auf dem: Oberflächendesign\nTaste: 9 +MAIN_TOOLTIP_BACKCOLOR0;Hintergrundfarbe der Vorschau basierend auf dem Oberflächendesign.\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR1;Hintergrundfarbe der Vorschau: Schwarz\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR2;Hintergrundfarbe der Vorschau: Weiß\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR3;Hintergrundfarbe der Vorschau: Mittleres Grau\nTaste: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Vorher-Ansicht: Sperren / Entsperren\n\nGesperrt: Friert die Vorher-Ansicht ein, so\ndass sich die Gesamtwirkung mehrerer\nBearbeitungsschritte beurteilen lässt.\n\nEntsperrt: Die Vorher-Ansicht hinkt dem\naktuellen Bild immer einen Bearbeitungs-\nschritt hinterher. -MAIN_TOOLTIP_HIDEHP;Linkes Bedienfeld ein-/ausblenden\nTaste: l -MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten\nTaste: < -MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten\nTaste: > +MAIN_TOOLTIP_HIDEHP;Linkes Bedienfeld ein-/ausblenden.\nTaste: l +MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten.\nTaste: < +MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten.\nTaste: > MAIN_TOOLTIP_PREVIEWB;Vorschau Blau-Kanal\nTaste: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Vorschau Fokusmaske\nTaste: Umschalt + f\n\nPräziser bei Bildern mit geringer Tiefenschärfe,\nniedrigem Rauschen und bei hoher Vergrößerung. MAIN_TOOLTIP_PREVIEWG;Vorschau Grün-Kanal\nTaste: g MAIN_TOOLTIP_PREVIEWL;Vorschau Helligkeit\nTaste: v\n\n0.299·R + 0.587·G + 0.114·B MAIN_TOOLTIP_PREVIEWR;Vorschau Rot-Kanal\nTaste: r -MAIN_TOOLTIP_PREVIEWSHARPMASK;Schärfungs-Kontroll-Maske ein-/ausschalten\n\nFunktioniert nur bei aktivierter Schärfung\nund Zoom >= 100%. -MAIN_TOOLTIP_QINFO;Bildinformationen ein-/ausblenden\nTaste: i -MAIN_TOOLTIP_SHOWHIDELP1;Linkes Bedienfeld ein-/ausblenden\nTaste: l -MAIN_TOOLTIP_SHOWHIDERP1;Rechtes Bedienfeld ein-/ausblenden\nTaste: Alt + l -MAIN_TOOLTIP_SHOWHIDETP1;Oberes Bedienfeld ein-/ausblenden\nTaste: Umschalt + l +MAIN_TOOLTIP_PREVIEWSHARPMASK;Schärfungs-Kontroll-Maske ein-/ausschalten.\n\nFunktioniert nur bei aktivierter Schärfung\nund Zoom >= 100%. +MAIN_TOOLTIP_QINFO;Bildinformationen ein-/ausblenden.\nTaste: i +MAIN_TOOLTIP_SHOWHIDELP1;Linkes Bedienfeld ein-/ausblenden.\nTaste: l +MAIN_TOOLTIP_SHOWHIDERP1;Rechtes Bedienfeld ein-/ausblenden.\nTaste: Alt + l +MAIN_TOOLTIP_SHOWHIDETP1;Oberes Bedienfeld ein-/ausblenden.\nTaste: Umschalt + l MAIN_TOOLTIP_THRESHOLD;Schwelle -MAIN_TOOLTIP_TOGGLE;Vorher/Nachher-Ansicht ein-/ausschalten\nTaste: Umschalt + b +MAIN_TOOLTIP_TOGGLE;Vorher/Nachher-Ansicht ein-/ausschalten.\nTaste: Umschalt + b MONITOR_PROFILE_SYSTEM;Systemvorgabe NAVIGATOR_B;B: NAVIGATOR_G;G: @@ -1090,7 +1092,7 @@ PREFERENCES_AUTLISMAX;Max.-Durchschnitt aller Kacheln PREFERENCES_AUTLISSTD;Hoch PREFERENCES_AUTLISVLOW;Keine PREFERENCES_AUTLOW;Niedrig -PREFERENCES_AUTOMONPROFILE;Automatisch das für den aktuellen Monitor festgelegte Profil verwenden. +PREFERENCES_AUTOMONPROFILE;Automatisch das für den aktuellen Monitor festgelegte Profil verwenden PREFERENCES_AUTOSAVE_TP_OPEN;Werkzeugstatus vor dem Beenden automatisch speichern PREFERENCES_AUTSTD;Standard PREFERENCES_BATCH_PROCESSING;Stapelverarbeitung @@ -1224,7 +1226,7 @@ PREFERENCES_NAVGUIDEBRUSH;Farbe der Navigationshilfe PREFERENCES_NAVIGATIONFRAME;Navigation PREFERENCES_NOISE;Rauschreduzierung 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_OUTDIRTEMPLATE;Dynamisches Verzeichnis verwenden PREFERENCES_OUTDIRTEMPLATEHINT;Die folgenden Variablen können verwendet werden:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r, %s1, %s2, ...\n\nDiese Variablen beinhalten bestimmte Teile des Verzeichnispfades, in welchem sich das Bild befindet, oder Attribute des Bildes.\n\nWenn zum Beispiel /home/tom/photos/2010-10-31/dsc0042.nef geöffnet wurde, dann haben die Variablen den folgenden Inhalt:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31\n%p2 = /home/tom/photos\n%p3 = /home/tom\n%p4 = /home\n\nWenn Sie die Ausgabedatei in dasselbe Verzeichnis wie das Originalbild speichern wollen, dann wählen Sie:\n%p1/%f\n\nWenn Sie die Ausgabedatei in ein Unterverzeichnis mit dem Namen "converted" schreiben wollen, dann wählen Sie:\n%p1/converted/%f\n\nWenn Sie die Ausgabedatei im Verzeichnispfad "/home/tom/photos/converted" speichern wollen, dort jedoch in einem mit dem Namen des Ursprungsverzeichnisses betitelten Unterverzeichnis, dann wählen Sie:\n%p2/converted/%d1/%f\n\nDie Variable %r enthält die Bewertung des Bildes. @@ -1246,10 +1248,10 @@ PREFERENCES_PRINTER;Drucker (Soft-Proofing) PREFERENCES_PROFILEHANDLING;Behandlung der Bearbeitungsprofile PREFERENCES_PROFILELOADPR;Priorität der Profile beim Laden PREFERENCES_PROFILEPRCACHE;Bearbeitungsprofil im Festplatten-Cache -PREFERENCES_PROFILEPRFILE;Bearbeitungsprofil, welches geladener Datei beiliegt (Sidecar) -PREFERENCES_PROFILESAVEBOTH;Verarbeitungsparameter im Festplatten-Cache und zusammen mit der Datei speichern +PREFERENCES_PROFILEPRFILE;Bearbeitungsprofil welches dem geladenen Bild beiliegt (Sidecar) +PREFERENCES_PROFILESAVEBOTH;Verarbeitungsparameter im Festplatten-Cache und zusammen mit dem Bild speichern PREFERENCES_PROFILESAVECACHE;Verarbeitungsparameter im Festplatten-Cache speichern -PREFERENCES_PROFILESAVEINPUT;Verarbeitungsparameter zusammen mit Datei speichern (Sidecar) +PREFERENCES_PROFILESAVEINPUT;Verarbeitungsparameter zusammen mit dem Bild speichern (Sidecar) PREFERENCES_PROFILESAVELOCATION;Speicherort der Profile PREFERENCES_PROFILE_NONE;Kein Farbprofil PREFERENCES_PROPERTY;Eigenschaft @@ -1325,10 +1327,10 @@ PROFILEPANEL_PINTERNAL;Neutral PROFILEPANEL_PLASTSAVED;Zuletzt gespeichert PROFILEPANEL_SAVEDLGLABEL;Bearbeitungsprofil speichern... PROFILEPANEL_SAVEPPASTE;Zu speichernde Parameter -PROFILEPANEL_TOOLTIPCOPY;Profil in Zwischenablage kopieren\n\nStrg-Taste beim Klicken festhalten, um\nzu kopierende Parameter auszuwählen. -PROFILEPANEL_TOOLTIPLOAD;Profil aus Datei laden\n\nStrg-Taste beim Klicken festhalten, um\nzu ladende Parameter auszuwählen. -PROFILEPANEL_TOOLTIPPASTE;Profil aus Zwischenablage einfügen\n\nStrg-Taste beim Klicken festhalten, um\neinzufügende Parameter auszuwählen. -PROFILEPANEL_TOOLTIPSAVE;Profil speichern\n\nStrg-Taste beim Klicken festhalten, um\nzu speichernde Parameter auszuwählen. +PROFILEPANEL_TOOLTIPCOPY;Profil in Zwischenablage kopieren.\n\nStrg-Taste beim Klicken festhalten, um\nzu kopierende Parameter auszuwählen. +PROFILEPANEL_TOOLTIPLOAD;Profil aus Datei laden.\n\nStrg-Taste beim Klicken festhalten, um\nzu ladende Parameter auszuwählen. +PROFILEPANEL_TOOLTIPPASTE;Profil aus Zwischenablage einfügen.\n\nStrg-Taste beim Klicken festhalten, um\neinzufügende Parameter auszuwählen. +PROFILEPANEL_TOOLTIPSAVE;Profil speichern.\n\nStrg-Taste beim Klicken festhalten, um\nzu speichernde Parameter auszuwählen. PROGRESSBAR_LOADING;Lade Bild... PROGRESSBAR_LOADINGTHUMBS;Lade Miniaturbilder... PROGRESSBAR_LOADJPEG;Lade JPEG... @@ -1384,17 +1386,17 @@ THRESHOLDSELECTOR_T;Oben THRESHOLDSELECTOR_TL;Oben-Links THRESHOLDSELECTOR_TR;Oben-Rechts TOOLBAR_TOOLTIP_COLORPICKER;Farbwähler\n\nWenn eingeschaltet:\n- Mit der linken Maustaste können Sie einen Farbwähler setzen.\n- Zum Verschieben, linke Maustaste festhalten.\n- Umschalttaste + Rechts-Klick entfernt alle Farbwähler.\n- Rechts-Klick auf den Farbwählerbutton blendet die Farbwähler ein/aus\n- Rechts-Klick in einen freien Bereich schaltet auf das Hand-Werkzeug zurück. -TOOLBAR_TOOLTIP_CROP;Ausschnitt wählen\nTaste: c\n\nZum Verschieben des Ausschnitts,\nUmschalttaste festhalten. +TOOLBAR_TOOLTIP_CROP;Ausschnitt wählen.\nTaste: c\n\nZum Verschieben des Ausschnitts,\nUmschalttaste festhalten. TOOLBAR_TOOLTIP_HAND;Hand-Werkzeug\nTaste: h TOOLBAR_TOOLTIP_STRAIGHTEN;Ausrichten / Drehen\nTaste: s\n\nRichtet das Bild entlang einer Leitlinie aus. -TOOLBAR_TOOLTIP_WB;Weißabgleich manuell setzen\nTaste: w +TOOLBAR_TOOLTIP_WB;Weißabgleich manuell setzen.\nTaste: w TP_BWMIX_ALGO;OYCPM-Algorithmus TP_BWMIX_ALGO_LI;Linear TP_BWMIX_ALGO_SP;Spezialeffekte -TP_BWMIX_ALGO_TOOLTIP;Linear liefert ein lineares Ergebnis\nSpezialeffekte liefert einen speziellen Effekt durch Mischen von Kanälen. +TP_BWMIX_ALGO_TOOLTIP;Linear liefert ein lineares Ergebnis.\nSpezialeffekte liefert einen speziellen Effekt durch Mischen von Kanälen. TP_BWMIX_AUTOCH;Auto TP_BWMIX_CC_ENABLED;Komplemantärfarbe anpassen -TP_BWMIX_CC_TOOLTIP;Aktiviert die automatische Anpassung der\nKomplementärfarbe im ROYGCBPM-Modus +TP_BWMIX_CC_TOOLTIP;Aktiviert die automatische Anpassung der\nKomplementärfarbe im ROYGCBPM-Modus. TP_BWMIX_CHANNEL;Luminanzequalizer TP_BWMIX_CURVEEDITOR1;“Bevor“-Kurve TP_BWMIX_CURVEEDITOR2;“Danach“-Kurve @@ -1458,36 +1460,36 @@ TP_CHMIXER_GREEN;Grün-Kanal TP_CHMIXER_LABEL;RGB-Kanalmixer TP_CHMIXER_RED;Rot-Kanal TP_CHROMATABERR_LABEL;Chromatische Aberration -TP_COARSETRAF_TOOLTIP_HFLIP;Horizontal spiegeln -TP_COARSETRAF_TOOLTIP_ROTLEFT;Nach links drehen\nTaste: [ -TP_COARSETRAF_TOOLTIP_ROTRIGHT;Nach rechts drehen\nTaste: ] -TP_COARSETRAF_TOOLTIP_VFLIP;Vertikal spiegeln +TP_COARSETRAF_TOOLTIP_HFLIP;Horizontal spiegeln. +TP_COARSETRAF_TOOLTIP_ROTLEFT;Nach links drehen.\nTaste: [ +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Nach rechts drehen.\nTaste: ] +TP_COARSETRAF_TOOLTIP_VFLIP;Vertikal spiegeln. TP_COLORAPP_ADAPTSCENE;Luminanz (cd/m²) -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute Luminanz der Szenenleuchstärket\n(normalerweise 2000cd/m²) +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute Luminanz der Szenenleuchstärket\n(normalerweise 2000cd/m²). TP_COLORAPP_ADAPTVIEWING;Luminanz (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute Luminanz der Betrachtungsumgebung\n(normalerweise 16cd/m²) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute Luminanz der Betrachtungsumgebung\n(normalerweise 16cd/m²). TP_COLORAPP_ADAP_AUTO_TOOLTIP;Wenn aktiviert (empfohlen), werden die optimalen\nWerte aus den Exif-Daten automatisch berechnet. TP_COLORAPP_ALGO;Algorithmus TP_COLORAPP_ALGO_ALL;Alle TP_COLORAPP_ALGO_JC;Helligkeit + Buntheit (JH) TP_COLORAPP_ALGO_JS;Helligkeit + Sättigung (JS) TP_COLORAPP_ALGO_QM;Helligkeit + Farbigkeit (QM) -TP_COLORAPP_ALGO_TOOLTIP;Auswahl zwischen Parameter-Teilmengen\nund allen Parametern +TP_COLORAPP_ALGO_TOOLTIP;Auswahl zwischen Parameter-Teilmengen\nund allen Parametern. TP_COLORAPP_BADPIXSL;Hot / Bad-Pixelfilter TP_COLORAPP_BADPIXSL_TOOLTIP;Unterdrückt “Hot / Bad“-Pixel\n\n0 = keine Auswirkung\n1 = Mittel\n2 = Gaussian TP_COLORAPP_BRIGHT;Helligkeit (Q) -TP_COLORAPP_BRIGHT_TOOLTIP;Helligkeit in CIECAM02 berücksichtigt die Weißintensität und unterscheidet sich von L*a*b* und RGB-Helligkeit +TP_COLORAPP_BRIGHT_TOOLTIP;Helligkeit in CIECAM02 berücksichtigt die Weißintensität und unterscheidet sich von L*a*b* und RGB-Helligkeit. TP_COLORAPP_CHROMA;Buntheit (H) TP_COLORAPP_CHROMA_M;Farbigkeit (M) -TP_COLORAPP_CHROMA_M_TOOLTIP;Die Farbigkeit in CIECAM02 unterscheidet sich\nvon L*a*b*- und RGB-Farbigkeit +TP_COLORAPP_CHROMA_M_TOOLTIP;Die Farbigkeit in CIECAM02 unterscheidet sich\nvon L*a*b*- und RGB-Farbigkeit. TP_COLORAPP_CHROMA_S;Sättigung (S) -TP_COLORAPP_CHROMA_S_TOOLTIP;Sättigung in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Sättigung -TP_COLORAPP_CHROMA_TOOLTIP;Buntheit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB-Buntheit +TP_COLORAPP_CHROMA_S_TOOLTIP;Sättigung in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Sättigung. +TP_COLORAPP_CHROMA_TOOLTIP;Buntheit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB-Buntheit. TP_COLORAPP_CIECAT_DEGREE;CAT02 Adaptation TP_COLORAPP_CONTRAST;Kontrast (J) TP_COLORAPP_CONTRAST_Q;Kontrast (Q) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Kontrast (Q) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast -TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast (J) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Kontrast (Q) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast. +TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast (J) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast. TP_COLORAPP_CURVEEDITOR1;Tonwertkurve 1 TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Zeigt das Histogramm von L (L*a*b*) vor CIECAM02.\nWenn "CIECAM02-Ausgabe-Histogramm in Kurven anzeigen" aktiviert ist, wird das Histogramm von J oder Q nach CIECAM02-Anpassungen angezeigt.\n\nJ und Q werden nicht im Haupt-Histogramm angezeigt.\nFür die endgültige Ausgabe verwenden Sie das Haupt-Histogramm. TP_COLORAPP_CURVEEDITOR2;Tonwertkurve 2 @@ -1497,18 +1499,18 @@ TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Korrigiert Buntheit, Sättigung oder Farbigkeit TP_COLORAPP_DATACIE;CIECAM02-Ausgabe-Histogramm in\nKurven anzeigen TP_COLORAPP_DATACIE_TOOLTIP;Wenn aktiviert, zeigen die Histogramme\nder CIECAM02-Kurven die angenäherten\nWerte/Bereiche für J oder Q und C, S oder M\nNACH den CIECAM02-Anpassungen an. Das\nbetrifft nicht das Haupt-Histogramm.\n\nWenn deaktiviert, zeigen die Histogramme\nder CIECAM02-Kurven die L*a*b*-Werte\nVOR den CIECAM02-Anpassungen an. TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Wenn aktiviert (empfohlen), wird ein optimaler\nWert berechnet, der von CAT02 und CIECAM02\nverwendet wird.\nUm den Wert manuell zu setzen, muss die Option\ndeaktiviert sein (Werte über 64 sind empfohlen). -TP_COLORAPP_DEGREE_TOOLTIP;Umfang der “CIE Chromatic Adaptation Transform 2002“ +TP_COLORAPP_DEGREE_TOOLTIP;Umfang der “CIE Chromatic Adaptation Transform 2002“. TP_COLORAPP_FREE;Farbtemperatur + Tönung + CAT02 + [Ausgabe] TP_COLORAPP_GAMUT;Gamutkontrolle (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Gamutkontrolle im L*a*b*-Modus erlauben. TP_COLORAPP_HUE;Farbton (H) -TP_COLORAPP_HUE_TOOLTIP;Farbton (H) - Winkel zwischen 0° und 360° +TP_COLORAPP_HUE_TOOLTIP;Farbton (H) - Winkel zwischen 0° und 360°. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Bildanpassungen TP_COLORAPP_LABEL_SCENE;Umgebungsbedingungen (Szene) TP_COLORAPP_LABEL_VIEWING;Betrachtungsbedingungen TP_COLORAPP_LIGHT;Helligkeit (J) -TP_COLORAPP_LIGHT_TOOLTIP;Helligkeit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Helligkeit +TP_COLORAPP_LIGHT_TOOLTIP;Helligkeit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Helligkeit. TP_COLORAPP_MODEL;Weißpunktmodell TP_COLORAPP_MODEL_TOOLTIP;Weißabgleich [RT] + [Ausgabe]:\nRT's Weißabgleich wird für die Szene verwendet,\nCIECAM02 auf D50 gesetzt und der Weißabgleich\ndes Ausgabegerätes kann unter:\nEinstellungen > Farb-Management\neingestellt werden.\n\nWeißabgleich [RT+CAT02] + [Ausgabe]:\nRT's Weißabgleich wird für CAT02 verwendet und\nder Weißabgleich des Ausgabegerätes kann unter\nEinstellungen > Farb-Management\neingestellt werden. TP_COLORAPP_NEUTRAL;Zurücksetzen @@ -1547,7 +1549,7 @@ TP_COLORTONING_BALANCE;Farbausgleich TP_COLORTONING_BY;o C/L TP_COLORTONING_CHROMAC;Deckkraft TP_COLORTONING_COLOR;Farbe -TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Buntheitsdeckkraft als Funktion der Luminanz oB = f(L) +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Buntheitsdeckkraft als Funktion der Luminanz oB = f(L). TP_COLORTONING_HIGHLIGHT;Lichter TP_COLORTONING_HUE;Farbton TP_COLORTONING_LAB;L*a*b*-Überlagerung @@ -1577,7 +1579,7 @@ TP_COLORTONING_STRENGTH;Intensität TP_COLORTONING_TWO2;Spezial-Farbe (2 Farben) TP_COLORTONING_TWOALL;Spezial-Farbe TP_COLORTONING_TWOBY;Spezial a* und b* -TP_COLORTONING_TWOCOLOR_TOOLTIP;Standardfarbe:\nLinearer Verlauf, a* = b*.\n\nSpezial-Farbe:\nLinearer Verlauf, a* = b*, aber nicht verbunden\n\nSpezial a* und b*:\nLinearer Verlauf, nicht verbunden, mit unterschiedlichen\nKurven für a* und b*. Bevorzugt für spezielle Effekte.\n\nSpezial-Farbe (2 Farben):\nBesser vorhersehbar +TP_COLORTONING_TWOCOLOR_TOOLTIP;Standardfarbe:\nLinearer Verlauf, a* = b*.\n\nSpezial-Farbe:\nLinearer Verlauf, a* = b*, aber nicht verbunden\n\nSpezial a* und b*:\nLinearer Verlauf, nicht verbunden, mit unterschiedlichen\nKurven für a* und b*. Bevorzugt für spezielle Effekte.\n\nSpezial-Farbe (2 Farben):\nBesser vorhersehbar. TP_COLORTONING_TWOSTD;Standardfarbe TP_CROP_FIXRATIO;Format TP_CROP_GTDIAGONALS;Diagonalregel @@ -1593,7 +1595,7 @@ TP_CROP_GUIDETYPE;Hilfslinien: TP_CROP_H;Höhe TP_CROP_LABEL;Ausschnitt TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Ausschnitt wählen +TP_CROP_SELECTCROP;Ausschnitt wählen. TP_CROP_W;Breite TP_CROP_X;x TP_CROP_Y;y @@ -1705,8 +1707,8 @@ TP_EXPOSURE_HISTMATCHING_TOOLTIP;Passt Regler und Kurven (mit Ausnahme der Belic TP_EXPOSURE_LABEL;Belichtung TP_EXPOSURE_SATURATION;Sättigung TP_EXPOSURE_TCMODE_FILMLIKE;Filmähnlich -TP_EXPOSURE_TCMODE_LABEL1;Tonwertkurve 1 Modus -TP_EXPOSURE_TCMODE_LABEL2;Tonwertkurve 2 Modus +TP_EXPOSURE_TCMODE_LABEL1;Tonwertkurve 1: Modus +TP_EXPOSURE_TCMODE_LABEL2;Tonwertkurve 2: Modus TP_EXPOSURE_TCMODE_LUMINANCE;Luminanz TP_EXPOSURE_TCMODE_PERCEPTUAL;Wahrnehmungsabhängig TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Sättigung und Überlagerung @@ -1739,12 +1741,12 @@ TP_GRADIENT_CENTER_X_TOOLTIP;Ankerpunkt der Rotationsachse X:\n-100 = linker Bil TP_GRADIENT_CENTER_Y;Rotationsachse Y TP_GRADIENT_CENTER_Y_TOOLTIP;Ankerpunkt der Rotationsachse Y:\n-100 = oberer Bildrand\n0 = Bildmitte\n+100 = unterer Bildrand TP_GRADIENT_DEGREE;Rotationswinkel -TP_GRADIENT_DEGREE_TOOLTIP;Rotationswinkel in Grad +TP_GRADIENT_DEGREE_TOOLTIP;Rotationswinkel in Grad. TP_GRADIENT_FEATHER;Bereich -TP_GRADIENT_FEATHER_TOOLTIP;Bereich des Verlaufs in Prozent der Bilddiagonalen +TP_GRADIENT_FEATHER_TOOLTIP;Bereich des Verlaufs in Prozent der Bilddiagonalen. TP_GRADIENT_LABEL;Grauverlaufsfilter TP_GRADIENT_STRENGTH;Intensität -TP_GRADIENT_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen +TP_GRADIENT_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen. TP_HLREC_BLEND;Überlagerung TP_HLREC_CIELAB;CIELab-Überlagerung TP_HLREC_COLOR;Farbübertragung @@ -1771,15 +1773,15 @@ TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpoliert TP_ICM_DCPILLUMINANT_TOOLTIP;DCP-Illumination auswählen. Vorgabe ist\nInterpoliert. Die Einstellung ist nur verfügbar\nwenn sie vom Eingangsfarbprofil unterstützt\nwird. TP_ICM_INPUTCAMERA;Kamera-Standard TP_ICM_INPUTCAMERAICC;Kameraspezifisches Profil -TP_ICM_INPUTCAMERAICC_TOOLTIP;Verwendet RawTherapees kameraspezifisches\nDCP/ICC-Eingangsfarbprofil, welches präziser als\neine einfache Matrix ist +TP_ICM_INPUTCAMERAICC_TOOLTIP;Verwendet RawTherapees kameraspezifisches\nDCP/ICC-Eingangsfarbprofil, welches präziser als\neine einfache Matrix ist. TP_ICM_INPUTCAMERA_TOOLTIP;Benutzt eine einfache Farbmatrix von DCRAW,\neine erweiterte RawTherapee-Version oder eine\naus einem DNG. TP_ICM_INPUTCUSTOM;DCP/ICC-Profil -TP_ICM_INPUTCUSTOM_TOOLTIP;Eigenes DCP/ICC-Farbprofil verwenden +TP_ICM_INPUTCUSTOM_TOOLTIP;Eigenes DCP/ICC-Farbprofil verwenden. TP_ICM_INPUTDLGLABEL;DCP/ICC-Profil wählen... TP_ICM_INPUTEMBEDDED;Eingebettetes Profil verwenden -TP_ICM_INPUTEMBEDDED_TOOLTIP;Farbprofil verwenden, das in Nicht-RAW-Bildern\neingebettet ist +TP_ICM_INPUTEMBEDDED_TOOLTIP;Farbprofil verwenden, das in Nicht-RAW-Bildern\neingebettet ist. TP_ICM_INPUTNONE;Kein Profil -TP_ICM_INPUTNONE_TOOLTIP;Kein Eingangsfarbprofil verwenden +TP_ICM_INPUTNONE_TOOLTIP;Kein Eingangsfarbprofil verwenden. TP_ICM_INPUTPROFILE;Eingangsfarbprofil TP_ICM_LABEL;Farbmanagement TP_ICM_NOICM;Kein ICM: sRGB-Ausgabe @@ -1854,24 +1856,24 @@ TP_METADATA_MODE;Kopiermodus TP_METADATA_STRIP;Keine TP_METADATA_TUNNEL;Unveränderte Daten TP_NEUTRAL;Zurücksetzen -TP_NEUTRAL_TIP;Belichtungseinstellungen auf\nneutrale Werte zurücksetzen +TP_NEUTRAL_TIP;Belichtungseinstellungen auf\nneutrale Werte zurücksetzen. TP_PCVIGNETTE_FEATHER;Bereich TP_PCVIGNETTE_FEATHER_TOOLTIP;Bereich:\n0 = nur Bildecken\n50 = halbe Strecke zum Mittelpunkt\n100 = bis zum Mittelpunkt TP_PCVIGNETTE_LABEL;Vignettierungsfilter TP_PCVIGNETTE_ROUNDNESS;Form TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Form:\n0 = Rechteck\n50 = Ellipse\n100 = Kreis TP_PCVIGNETTE_STRENGTH;Intensität -TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen (bezogen auf die Bildecken) +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen (bezogen auf die Bildecken). TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspektive TP_PERSPECTIVE_VERTICAL;Vertikal TP_PFCURVE_CURVEEDITOR_CH;Farbton TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Regelt die Intensität der Farbsaumentfernung\nnach Farben. Je höher die Kurve desto stärker\nist der Effekt. TP_PREPROCESS_DEADPIXFILT;Dead-Pixel-Filter -TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Entfernt tote Pixel +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Entfernt tote Pixel. TP_PREPROCESS_GREENEQUIL;Grün-Ausgleich TP_PREPROCESS_HOTPIXFILT;Hot-Pixel-Filter -TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Entfernt Hot-Pixel +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Entfernt Hot-Pixel. TP_PREPROCESS_LABEL;Vorverarbeitung TP_PREPROCESS_LINEDENOISE;Zeilenrauschfilter TP_PREPROCESS_LINEDENOISE_DIRECTION;Richtung @@ -1945,7 +1947,7 @@ TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Gleicht die Helligkeit der Frames an den ak TP_RAW_PIXELSHIFTEXP0;Experimentell TP_RAW_PIXELSHIFTGREEN;Bewegung im Grün-Kanal erkennen TP_RAW_PIXELSHIFTHOLEFILL;Lücken in der Bewegungsmaske erkennen -TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Lücken in der Bewegungsmaske erkennen +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Lücken in der Bewegungsmaske erkennen. TP_RAW_PIXELSHIFTLMMSE;LMMSE für Bewegungsbereiche verwenden TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;LMMSE anstatt AMaZE für bewegte Bildbereiche verwenden.\nSinnvoll bei High-ISO-Aufnahmen. TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold @@ -2053,7 +2055,7 @@ TP_RETINEX_MEDIAN;Medianfilter TP_RETINEX_METHOD;Methode TP_RETINEX_METHOD_TOOLTIP;Schatten wirkt sich auf dunkle Bereiche aus.\n\nSchatten / Lichter wirkt sich auf dunkle und helle Bereiche aus.\n\nLichter wirkt sich auf helle Bereiche aus.\n\nSpitzlichter wirkt sich auf sehr helle Bereiche aus und reduziert\nMagenta-Falschfarben. TP_RETINEX_MLABEL;Schleierred: Min = %1, Max = %2 -TP_RETINEX_MLABEL_TOOLTIP;Sollte nahe bei Min = 0 und Max = 32768 sein +TP_RETINEX_MLABEL_TOOLTIP;Sollte nahe bei Min = 0 und Max = 32768 sein. TP_RETINEX_NEIGHBOR;Radius TP_RETINEX_NEUTRAL;Zurücksetzen TP_RETINEX_NEUTRAL_TIP;Setzt alle Regler und Kurven\nauf ihre Standardwerte zurück. @@ -2091,7 +2093,7 @@ TP_RGBCURVES_LUMAMODE_TOOLTIP;Der Helligkeitsmodus ändert die Helligkeit TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Winkel TP_ROTATE_LABEL;Drehen -TP_ROTATE_SELECTLINE;Leitlinie wählen +TP_ROTATE_SELECTLINE;Leitlinie wählen. TP_SAVEDIALOG_OK_TIP;Taste: Strg + Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Lichter TP_SHADOWSHLIGHTS_HLTONALW;Tonwertbreite Lichter @@ -2139,7 +2141,7 @@ TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Rot / Violett TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Rot TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Rot / Gelb TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Gelb -TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Farbton als Funktion des Farbtons H = f(H) +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Farbton als Funktion des Farbtons H = f(H). TP_VIBRANCE_LABEL;Dynamik TP_VIBRANCE_PASTELS;Pastelltöne TP_VIBRANCE_PASTSATTOG;Pastell und gesättigte Töne koppeln @@ -2189,7 +2191,7 @@ TP_WAVELET_CHCU;Kurve TP_WAVELET_CHR;Farb-Kontrast-Verknüpfung TP_WAVELET_CHRO;Ebenengrenze Gesättigte/Pastellfarben TP_WAVELET_CHRO_TOOLTIP;Waveletebene (n) die, die Grenze zwischen gesättigten und Pastellfarben bestimmt.\n1-n: Gesättigte Farben\nn-9: Pastellfarben\n\nIst der Wert größer als die vorgegebene Anzahl an Waveletebenen werden diese ignoriert. -TP_WAVELET_CHR_TOOLTIP;Farbton als Funktion des Kontrasts und der Farb-Kontrast-Verknüpfung +TP_WAVELET_CHR_TOOLTIP;Farbton als Funktion des Kontrasts und der Farb-Kontrast-Verknüpfung. TP_WAVELET_CHSL;Regler TP_WAVELET_CHTYPE;Chrominanzmethode TP_WAVELET_COLORT;Deckkraft Rot / Grün @@ -2202,15 +2204,15 @@ TP_WAVELET_CONTR;Gamut TP_WAVELET_CONTRA;Kontrast TP_WAVELET_CONTRAST_MINUS;Kontrast - TP_WAVELET_CONTRAST_PLUS;Kontrast + -TP_WAVELET_CONTRA_TOOLTIP;Ändert den Kontrast des Restbildes +TP_WAVELET_CONTRA_TOOLTIP;Ändert den Kontrast des Restbildes. TP_WAVELET_CTYPE;Chrominanzkontrolle TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Lokaler Kontrast als Funktion des ursprünglichen Kontrasts.\n\nNiedrige Werte: Wenig lokaler Kontrast (Werte zwischen 10 - 20)\n50%: Durchschnittlicher lokaler Kontrast (Werte zwischen 100 - 300)\n66%: Standardabweichung des Lokalen Kontrasts (Werte zwischen 300 - 800)\n100%: Maximaler lokaler Kontrast (Werte zwischen 3000 - 8000)\n TP_WAVELET_CURVEEDITOR_CH;Kontrast = f(H) TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Kontrast als Funktion des Farbtons.\nAchten Sie darauf, dass Sie die Werte beim\nGamut-Farbton nicht überschreiben\n\nDie Kurve hat nur Auswirkung, wenn die Wavelet-\nKontrastregler nicht auf “0“ stehen. TP_WAVELET_CURVEEDITOR_CL;L -TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Wendet eine Kontrasthelligkeitskurve\nam Ende der Waveletverarbeitung an.\n +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Wendet eine Kontrasthelligkeitskurve\nam Ende der Waveletverarbeitung an. TP_WAVELET_CURVEEDITOR_HH;HH -TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Farbton als Funktion des Farbtons H = f(H) +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Farbton als Funktion des Farbtons H = f(H). TP_WAVELET_DALL;Alle Richtungen TP_WAVELET_DAUB;Kantenperformance TP_WAVELET_DAUB2;D2 - niedrig @@ -2285,7 +2287,7 @@ TP_WAVELET_NPTYPE_TOOLTIP;Dieser Algorithmus verwendet ein Pixel und acht\nseine TP_WAVELET_OPACITY;Deckkraft Blau / Gelb TP_WAVELET_OPACITYW;Kontrastausgleichskurve TP_WAVELET_OPACITYWL;Lokale Kontrastkurve -TP_WAVELET_OPACITYWL_TOOLTIP;Wendet eine lokale Kontrastkurve am\nEnde der Wavelet-Verarbeitung an.\n\nLinks stellt den niedrigsten, rechts den\nhöchsten Kontrast dar.\n +TP_WAVELET_OPACITYWL_TOOLTIP;Wendet eine lokale Kontrastkurve am\nEnde der Wavelet-Verarbeitung an.\n\nLinks stellt den niedrigsten, rechts den\nhöchsten Kontrast dar. TP_WAVELET_PASTEL;Pastellfarben TP_WAVELET_PROC;Verarbeitung TP_WAVELET_RE1;Schärfung verstärken @@ -2374,4 +2376,3 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Ausschnitt an Bildschirm anpassen\nTaste: f ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - - From ce8ead804bc8ee296f1d5847eb239fc4826cf1db Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 19 Aug 2018 16:38:02 +0200 Subject: [PATCH 27/33] Changing lens correction method triggers processing twice, fixes #4740 --- rtgui/lensprofile.cc | 152 ++++++++++++++++++++++--------------------- rtgui/lensprofile.h | 2 +- 2 files changed, 79 insertions(+), 75 deletions(-) diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index df26678d9..a89fdb51e 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -139,10 +139,10 @@ LensProfilePanel::LensProfilePanel () : lensfunCameras->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunCameraChanged)); lensfunLenses->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunLensChanged)); - corrOff->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - corrLensfunAuto->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - corrLensfunManual->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - corrLcpFile->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); + corrOff->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrOff)); + corrLensfunAuto->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunAuto)); + corrLensfunManual->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunManual)); + corrLcpFile->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLcpFile)); corrUnchanged->hide(); @@ -499,84 +499,88 @@ void LensProfilePanel::onLensfunLensChanged() } -void LensProfilePanel::onCorrModeChanged() +void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton *rbChanged) { - Glib::ustring mode; + if (rbChanged->get_active()) { + // because the method gets called for the enabled AND the disabled RadioButton, we do the processing only for the enabled one + Glib::ustring mode; - if (corrOff->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - - ckbUseDist->set_sensitive(false); - ckbUseVign->set_sensitive(false); - ckbUseCA->set_sensitive(false); - - mode = M("GENERAL_NONE"); - } else if (corrLensfunAuto->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - useDistChanged = true; - useVignChanged = true; + if (rbChanged == corrOff) { + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; - ckbUseDist->set_sensitive(true); - ckbUseVign->set_sensitive(true); - ckbUseCA->set_sensitive(false); + ckbUseDist->set_sensitive(false); + ckbUseVign->set_sensitive(false); + ckbUseCA->set_sensitive(false); - if (metadata) { - bool b = disableListener(); - const LFDatabase *db = LFDatabase::getInstance(); - LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel()); - LFLens l = db->findLens(c, metadata->getLens()); - setLensfunCamera(c.getMake(), c.getModel()); - setLensfunLens(l.getLens()); - if (b) { - enableListener(); + mode = M("GENERAL_NONE"); + } else if (rbChanged == corrLensfunAuto) { + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; + useDistChanged = true; + useVignChanged = true; + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(false); + + if (metadata) { + bool b = disableListener(); + const LFDatabase *db = LFDatabase::getInstance(); + LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel()); + LFLens l = db->findLens(c, metadata->getLens()); + setLensfunCamera(c.getMake(), c.getModel()); + setLensfunLens(l.getLens()); + if (b) { + enableListener(); + } } + + mode = M("LENSPROFILE_CORRECTION_AUTOMATCH"); + } else if (rbChanged == corrLensfunManual) { + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; + useDistChanged = true; + useVignChanged = true; + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(false); + + mode = M("LENSPROFILE_CORRECTION_MANUAL"); + } else if (rbChanged == corrLcpFile) { + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; + useDistChanged = true; + useVignChanged = true; + + updateDisabled(true); + + mode = M("LENSPROFILE_CORRECTION_LCPFILE"); + } else if (rbChanged == corrUnchanged) { + useLensfunChanged = false; + lensfunAutoChanged = false; + lcpFileChanged = false; + lensfunCameraChanged = false; + lensfunLensChanged = false; + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(true); + + mode = M("GENERAL_UNCHANGED"); } - mode = M("LENSPROFILE_CORRECTION_AUTOMATCH"); - } else if (corrLensfunManual->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - useDistChanged = true; - useVignChanged = true; + lcModeChanged = true; + updateLensfunWarning(); - ckbUseDist->set_sensitive(true); - ckbUseVign->set_sensitive(true); - ckbUseCA->set_sensitive(false); - - mode = M("LENSPROFILE_CORRECTION_MANUAL"); - } else if (corrLcpFile->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - useDistChanged = true; - useVignChanged = true; - - updateDisabled(true); - - mode = M("LENSPROFILE_CORRECTION_LCPFILE"); - } else if (corrUnchanged->get_active()) { - useLensfunChanged = false; - lensfunAutoChanged = false; - lcpFileChanged = false; - lensfunCameraChanged = false; - lensfunLensChanged = false; - - ckbUseDist->set_sensitive(true); - ckbUseVign->set_sensitive(true); - ckbUseCA->set_sensitive(true); - - mode = M("GENERAL_UNCHANGED"); - } - lcModeChanged = true; - updateLensfunWarning(); - - if (listener) { - listener->panelChanged(EvLensCorrMode, mode); + if (listener) { + listener->panelChanged(EvLensCorrMode, mode); + } } } diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index e70515470..8c814e6fc 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -105,7 +105,7 @@ public: void onLensfunCameraChanged(); void onLensfunLensChanged(); - void onCorrModeChanged(); + void onCorrModeChanged(const Gtk::RadioButton *rbChanged); }; #endif From 6f29915045ca1d1ad6dd8b47c5bbac552ffe6ded Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 20 Aug 2018 14:24:22 +0200 Subject: [PATCH 28/33] remove useless check for very larg files, found by coverity --- rtengine/dcraw.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 127a2aeb8..da66bd6d8 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -8937,7 +8937,9 @@ void CLASS identify() for (i=0; i < 0x10000; i++) curve[i] = i; flen = fsize = ifp->size; - /*RT*/ if (fsize<100000 || fsize > 0x7fffffff) { + + // currently fsize is of type signed int which means for files larger than 0x7fffffff byte fsize will be < 0. We need to check for large files if we change the type to unsigned int + /*RT*/ if (fsize<100000) { is_raw = 0; return; } From bd568ab95735b08d66dde8734d482e5daba26584 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 20 Aug 2018 21:32:16 +0200 Subject: [PATCH 29/33] Prevent flashing background color of the preview when adding nodes to a curve using on-canvas picker, fixes #4743 --- rtgui/cropwindow.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 77118277c..3865591ce 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -1379,7 +1379,7 @@ void CropWindow::expose (Cairo::RefPtr cr) break; } } - bool useBgColor = (state == SNormal); + bool useBgColor = (state == SNormal || state == SDragPicker || state == SDeletePicker); if (cropHandler.cropPixbuf) { imgW = cropHandler.cropPixbuf->get_width (); From b80abe60e8477a0a3f4a130c47e2d928e955b98f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 20 Aug 2018 21:54:21 +0200 Subject: [PATCH 30/33] When Demosaic/None is set, always show raw values and never show Lab/HSV values, #4584 --- rtgui/cropwindow.cc | 6 ++- rtgui/navigator.cc | 72 +++++++++++++++++++++-------------- rtgui/navigator.h | 4 +- rtgui/pointermotionlistener.h | 4 +- 4 files changed, 51 insertions(+), 35 deletions(-) diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 3865591ce..c02f3632f 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -1053,12 +1053,14 @@ void CropWindow::pointerMoved (int bstate, int x, int y) int rval = pix[0]; int gval = pix[1]; int bval = pix[2]; + bool isRaw = false; if (vx < imwidth && vy < imheight) { rtengine::StagedImageProcessor* ipc = iarea->getImProcCoordinator(); if(ipc) { procparams::ProcParams params; ipc->getParams(¶ms); - if(params.raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) || params.raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE)) { + isRaw = params.raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) || params.raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE); + if(isRaw) { ImageSource *isrc = static_cast(ipc->getInitialImage()); isrc->getRawValues(mx, my, params.coarse.rotate, rval, gval, bval); } @@ -1066,7 +1068,7 @@ void CropWindow::pointerMoved (int bstate, int x, int y) // Updates the Navigator // TODO: possible double color conversion if rval, gval, bval come from cropHandler.cropPixbuftrue ? see issue #4583 - pmlistener->pointerMoved (true, cropHandler.colorParams.outputProfile, cropHandler.colorParams.workingProfile, mx, my, rval, gval, bval); + pmlistener->pointerMoved (true, cropHandler.colorParams.outputProfile, cropHandler.colorParams.workingProfile, mx, my, rval, gval, bval, isRaw); if (pmhlistener) { // Updates the HistogramRGBArea diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index e34a909df..732b9f323 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -224,24 +224,30 @@ void Navigator::setInvalid (int fullWidth, int fullHeight) LAB_L->set_text (M("NAVIGATOR_NA")); } -void Navigator::getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB) +void Navigator::getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw) { - switch (currentRGBUnit) { - case (Options::NavigatorUnit::R0_1): - sR = Glib::ustring::format(std::fixed, std::setprecision(4), r / 255.f); - sG = Glib::ustring::format(std::fixed, std::setprecision(4), g / 255.f); - sB = Glib::ustring::format(std::fixed, std::setprecision(4), b / 255.f); - break; - case (Options::NavigatorUnit::R0_255): + if (isRaw) { sR = Glib::ustring::format(std::fixed, std::setprecision(0), r); sG = Glib::ustring::format(std::fixed, std::setprecision(0), g); sB = Glib::ustring::format(std::fixed, std::setprecision(0), b); - break; - case (Options::NavigatorUnit::PERCENT): - default: - sR = Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f / 255.f) + Glib::ustring("%"); - sG = Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f / 255.f) + Glib::ustring("%"); - sB = Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.f / 255.f) + Glib::ustring("%"); + } else { + switch (currentRGBUnit) { + case (Options::NavigatorUnit::R0_1): + sR = Glib::ustring::format(std::fixed, std::setprecision(4), r / 255.f); + sG = Glib::ustring::format(std::fixed, std::setprecision(4), g / 255.f); + sB = Glib::ustring::format(std::fixed, std::setprecision(4), b / 255.f); + break; + case (Options::NavigatorUnit::R0_255): + sR = Glib::ustring::format(std::fixed, std::setprecision(0), r); + sG = Glib::ustring::format(std::fixed, std::setprecision(0), g); + sB = Glib::ustring::format(std::fixed, std::setprecision(0), b); + break; + case (Options::NavigatorUnit::PERCENT): + default: + sR = Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f / 255.f) + Glib::ustring("%"); + sG = Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f / 255.f) + Glib::ustring("%"); + sB = Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.f / 255.f) + Glib::ustring("%"); + } } } @@ -274,34 +280,42 @@ void Navigator::getLABText (float l, float a, float b, Glib::ustring &sL, Glib:: } // if !validPos then x/y contain the full image size -void Navigator::pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b) +void Navigator::pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw) { if (!validPos) { setInvalid (x, y); } else { Glib::ustring s1, s2, s3; - float h, s, v; - float LAB_a, LAB_b, LAB_l; position->set_text (Glib::ustring::compose ("x: %1, y: %2", x, y)); - getRGBText (r, g, b, s1, s2, s3); + getRGBText (r, g, b, s1, s2, s3, isRaw); R->set_text (s1); G->set_text (s2); B->set_text (s3); + if (isRaw) { + H->set_text ("--"); + S->set_text ("--"); + V->set_text ("--"); + LAB_L->set_text ("--"); + LAB_A->set_text ("--"); + LAB_B->set_text ("--"); + } else { + float h, s, v; + float LAB_a, LAB_b, LAB_l; + Color::rgb2hsv01(r / 255.f, g / 255.f, b / 255.f, h, s, v); + getHSVText (h, s, v, s1, s2, s3); + H->set_text (s1); + S->set_text (s2); + V->set_text (s3); - Color::rgb2hsv01(r / 255.f, g / 255.f, b / 255.f, h, s, v); - getHSVText (h, s, v, s1, s2, s3); - H->set_text (s1); - S->set_text (s2); - V->set_text (s3); - - Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, LAB_l, LAB_a, LAB_b, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? - getLABText (LAB_l, LAB_a, LAB_b, s1, s2, s3); - LAB_L->set_text (s1); - LAB_A->set_text (s2); - LAB_B->set_text (s3); + Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, LAB_l, LAB_a, LAB_b, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? + getLABText (LAB_l, LAB_a, LAB_b, s1, s2, s3); + LAB_L->set_text (s1); + LAB_A->set_text (s2); + LAB_B->set_text (s3); + } } } diff --git a/rtgui/navigator.h b/rtgui/navigator.h index 6108e2809..e7689b7c2 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -55,10 +55,10 @@ public: // pointermotionlistener interface // void pointerMoved (bool validPos, int x, int y, int r, int g, int b); - void pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b); + void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool raw = false); void setInvalid (int fullWidth = -1, int fullHeight = -1); - void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB); + void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw = false); void getHSVText (float h, float s, float v, Glib::ustring &sH, Glib::ustring &sS, Glib::ustring &sV); void getLABText (float l, float a, float b, Glib::ustring &sL, Glib::ustring &sA, Glib::ustring &sB); diff --git a/rtgui/pointermotionlistener.h b/rtgui/pointermotionlistener.h index 09a9b3b4f..7a275972d 100644 --- a/rtgui/pointermotionlistener.h +++ b/rtgui/pointermotionlistener.h @@ -27,9 +27,9 @@ protected: public: virtual ~PointerMotionListener() {} - virtual void pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b) {} + virtual void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) {} virtual void toggleFreeze () {} - virtual void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB) { sR = "--"; sG = "--"; sB = "--"; } + virtual void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw = false) { sR = "--"; sG = "--"; sB = "--"; } virtual void getHSVText (float h, float s, float v, Glib::ustring &sH, Glib::ustring &sS, Glib::ustring &sV) { sH = "--"; sS = "--"; sV = "--"; } virtual void getLABText (float l, float a, float b, Glib::ustring &sL, Glib::ustring &sA, Glib::ustring &sB) { sL = "--"; sA = "--"; sB = "--"; } From 6d60d1093e4bbc7a4dd8f8e3452f7bc8275e41fb Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 22 Aug 2018 11:51:28 +0200 Subject: [PATCH 31/33] SEGV when using curve pipette in Lab tool while lab tool is disabled, fixes #4709 --- rtengine/iimage.h | 8 ++++++++ rtengine/improcfun.cc | 33 ++++++++++++++++++++------------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index d09f46a3a..503f7cd44 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -587,6 +587,14 @@ public: } } + void fill (T value) { + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + v(i, j) = value; + } + } + } + }; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 232533292..945eaf29f 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4123,21 +4123,9 @@ void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, LUTf & cur void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve) { - if (!params->labCurve.enabled) { - if (params->blackwhite.enabled && !params->colorToning.enabled) { - for (int i = 0; i < lnew->H; ++i) { - for (int j = 0; j < lnew->W; ++j) { - lnew->a[i][j] = lnew->b[i][j] = 0.f; - } - } - } - return; - } - + int W = lold->W; int H = lold->H; - // lhskcurve.dump("lh_curve"); - //init Flatcurve for C=f(H) PlanarWhateverData* editWhatever = nullptr; EditUniqueID editID = EUID_None; @@ -4163,6 +4151,25 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW } } + if (!params->labCurve.enabled) { + if (editPipette && (editID == EUID_Lab_LCurve || editID == EUID_Lab_aCurve || editID == EUID_Lab_bCurve || editID == EUID_Lab_LHCurve || editID == EUID_Lab_CHCurve || editID == EUID_Lab_HHCurve || editID == EUID_Lab_CLCurve || editID == EUID_Lab_CCurve || editID == EUID_Lab_LCCurve)) { + // fill pipette buffer with zeros to avoid crashes + editWhatever->fill(0.f); + } + if (params->blackwhite.enabled && !params->colorToning.enabled) { + for (int i = 0; i < lnew->H; ++i) { + for (int j = 0; j < lnew->W; ++j) { + lnew->a[i][j] = lnew->b[i][j] = 0.f; + } + } + } + return; + } + + // lhskcurve.dump("lh_curve"); + //init Flatcurve for C=f(H) + + FlatCurve* chCurve = nullptr;// curve C=f(H) bool chutili = false; From 140f9774d4ab269c66792e5e1aaafd3290b75132 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 22 Aug 2018 14:04:30 +0200 Subject: [PATCH 32/33] Working Profile > Gamma and Slope are ingnored if Profiled Lens Correction is active and any slider in the Exposure Tool is changed, fixes #4745 --- rtengine/dcrop.cc | 2 +- rtengine/improccoordinator.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 0b5198c3c..2d376044e 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -807,7 +807,7 @@ void Crop::update(int todo) } - if (todo & M_AUTOEXP) { + if (todo & (M_AUTOEXP | M_RGBCURVE)) { if (params.icm.workingTRC == "Custom") { //exec TRC IN free Glib::ustring profile; profile = params.icm.workingProfile; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 50cab329d..3e9d7ab8f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -497,7 +497,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) progress("Exposure curve & CIELAB conversion...", 100 * readyphase / numofphases); - if (todo & M_AUTOEXP) { + if (todo & (M_AUTOEXP | M_RGBCURVE)) { if (params.icm.workingTRC == "Custom") { //exec TRC IN free Glib::ustring profile; profile = params.icm.workingProfile; From 3e7f19c81b9a46f66d4ddffa1ea0f8480d4b2421 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 22 Aug 2018 14:57:07 +0200 Subject: [PATCH 33/33] eahd demosaic: disabled timing code --- rtengine/eahd_demosaic.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index 5f79bdbb0..aef016386 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -28,7 +28,7 @@ #include "rt_math.h" #include "../rtgui/multilangmgr.h" #include "procparams.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" using namespace std;