From ee345ba376f15069c076fb0f8d1100ad6d4a62ce Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 2 Jul 2018 17:41:50 +0200 Subject: [PATCH 1/5] histmatching: use fewer points in the auto-matched curve makes editing the curve by hand much easier --- rtengine/histmatching.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 0faa8c357..5db504816 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -100,7 +100,6 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) { curve.clear(); - const int npoints = 8; int idx = 15; for (; idx < int(mapping.size()); ++idx) { if (mapping[idx] >= idx) { @@ -114,7 +113,6 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) } } } - int step = std::max(int(mapping.size())/npoints, 1); auto coord = [](int v) -> double { return double(v)/255.0; }; auto doit = @@ -147,9 +145,17 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) while (start < idx && (mapping[start] < 0 || start < idx / 2)) { ++start; } - - 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); + + const int npoints = 8; + int step = std::max(int(mapping.size())/npoints, 1); + int end = mapping.size(); + if (idx <= end / 3) { + doit(start, idx, idx / 2, true); + doit(idx, end, (end - idx) / 3, false); + } 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); + } if (curve.size() > 2 && (1 - curve[curve.size()-2] <= step / (256.0 * 3))) { curve.pop_back(); From 9224d6e18cbb44a88de13673cc9b9bb016f13f05 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 7 Jul 2018 16:09:37 +0200 Subject: [PATCH 2/5] Floating point dng files in [0;1] range have black thumbnail, fixes #4669 --- rtengine/dcraw.cc | 26 -------------------------- rtengine/rawimage.h | 17 +++++++++++++++++ rtengine/rtthumbnail.cc | 24 ++++++++++++++++++++---- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 227efe6b9..859aea3a1 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -10043,29 +10043,6 @@ static void expandFloats(Bytef * dst, int tileWidth, int bytesps) { } } -static void copyFloatDataToInt(float * src, ushort * dst, size_t size, float max) { - bool negative = false, nan = false; - -#ifdef _OPENMP -#pragma omp parallel for -#endif - for (size_t i = 0; i < size; ++i) { - if (src[i] < 0.0f) { - negative = true; - src[i] = 0.0f; - } else if (std::isnan(src[i])) { - nan = true; - src[i] = max; - } - // Copy the data to the integer buffer to build the thumbnail - dst[i] = (ushort)src[i]; - } - if (negative) - fprintf(stderr, "DNG Float: Negative data found in input file\n"); - if (nan) - fprintf(stderr, "DNG Float: NaN data found in input file\n"); -} - static int decompress(size_t srcLen, size_t dstLen, unsigned char *in, unsigned char *out) { // At least in zlib 1.2.11 the uncompress function is not thread save while it is thread save in zlib 1.2.8 // This simple replacement is thread save. Used example code from https://zlib.net/zlib_how.html @@ -10207,9 +10184,6 @@ void CLASS deflate_dng_load_raw() { } } - if (ifd->sample_format == 3) { // Floating point data - copyFloatDataToInt(float_raw_image, raw_image, raw_width*raw_height, maximum); - } } /* RT: removed unused functions */ diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 95e7aea8d..7595ad196 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -167,10 +167,22 @@ public: { return top_margin; } + + int get_rawwidth() const + { + return raw_width; + } + int get_FujiWidth() const { return fuji_width; } + + float const * get_FloatRawImage() const + { + return float_raw_image; + } + eSensorType getSensorType(); void getRgbCam (float rgbcam[3][4]); @@ -312,6 +324,11 @@ public: return filters == 9; } + bool isFloat() const + { + return float_raw_image; + } + public: // dcraw functions void pre_interpolate() diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 47a6d7349..fa5abb8a4 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -66,7 +66,11 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4], if (ri->isBayer()) { const int height = ri->get_iheight(); const int width = ri->get_iwidth(); - + const bool isFloat = ri->isFloat(); + const int top_margin = ri->get_topmargin(); + const int left_margin = ri->get_leftmargin(); + const int raw_width = ri->get_rawwidth(); + const float * const float_raw_image = ri->get_FloatRawImage(); #ifdef _OPENMP #pragma omp parallel for if(multiThread) #endif @@ -76,8 +80,15 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4], int col = 0; for (; col < width - 1; col += 2) { - float val0 = image[row * width + col][c0]; - float val1 = image[row * width + col + 1][c1]; + float val0; + float val1; + if (isFloat) { + val0 = float_raw_image[(row + top_margin) * raw_width + col + left_margin]; + val1 = float_raw_image[(row + top_margin) * raw_width + col + left_margin + 1]; + } else { + val0 = image[row * width + col][c0]; + val1 = image[row * width + col + 1][c1]; + } val0 -= cblack[c0]; val1 -= cblack[c1]; val0 *= scale_mul[c0]; @@ -87,7 +98,12 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4], } if (col < width) { // in case width is odd - float val0 = image[row * width + col][c0]; + float val0; + if (isFloat) { + val0 = float_raw_image[(row + top_margin) * raw_width + col + left_margin]; + } else { + val0 = image[row * width + col][c0]; + } val0 -= cblack[c0]; val0 *= scale_mul[c0]; image[row * width + col][c0] = rtengine::CLIP (val0); From 7f897e4e4d1fcb05b383a2090e4aee4da23bd095 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 7 Jul 2018 16:39:28 +0200 Subject: [PATCH 3/5] fix #4669 also for xtrans --- rtengine/rtthumbnail.cc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index fa5abb8a4..9279e8829 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -112,6 +112,11 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4], } else if (ri->isXtrans()) { const int height = ri->get_iheight(); const int width = ri->get_iwidth(); + const bool isFloat = ri->isFloat(); + const int top_margin = ri->get_topmargin(); + const int left_margin = ri->get_leftmargin(); + const int raw_width = ri->get_rawwidth(); + const float * const float_raw_image = ri->get_FloatRawImage(); #ifdef _OPENMP #pragma omp parallel for if(multiThread) @@ -127,7 +132,12 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4], for (; col < width - 5; col += 6) { for (int i = 0; i < 6; ++i) { const unsigned ccol = c[i]; - float val = image[row * width + col + i][ccol]; + float val; + if (isFloat) { + val = float_raw_image[(row + top_margin) * raw_width + col + i + left_margin]; + } else { + val = image[row * width + col + i][ccol]; + } val -= cblack[ccol]; val *= scale_mul[ccol]; image[row * width + col + i][ccol] = rtengine::CLIP (val); @@ -136,7 +146,12 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4], for (; col < width; ++col) { // remaining columns const unsigned ccol = ri->XTRANSFC (row, col); - float val = image[row * width + col][ccol]; + float val; + if (isFloat) { + val = float_raw_image[(row + top_margin) * raw_width + col + left_margin]; + } else { + val = image[row * width + col][ccol]; + } val -= cblack[ccol]; val *= scale_mul[ccol]; image[row * width + col][ccol] = rtengine::CLIP (val); From dfa31dddcd88eb15844b695cd7f001d7fd30e56f Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 9 Jul 2018 12:22:00 +0200 Subject: [PATCH 4/5] Japanese translation updated by firefly Closes #4677 --- rtdata/languages/Deutsch | 12 ++++-------- rtdata/languages/Japanese | 34 +++++++++++++++------------------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index ef342a966..0a1608184 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -806,6 +806,7 @@ HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;(Sensor-Matrix)\nVorverarbeitung\nR HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;(Sensor-Matrix)\nVorverarbeitung\nPDAF-Zeilenfilter HISTORY_MSG_PRSHARPEN_CONTRAST;(Skalieren) - Schärfen\nKontrastschwelle HISTORY_MSG_RAW_BORDER;(Sensor-Matrix)\nFarbinterpolation\nBildrand +HISTORY_MSG_RESIZE_ALLOW_UPSCALING;(Skalieren)\nHochskalieren zulassen HISTORY_MSG_SHARPENING_CONTRAST;(Schärfung)\nKontrastschwelle HISTORY_MSG_SOFTLIGHT_ENABLED;(Weiches Licht) HISTORY_MSG_SOFTLIGHT_STRENGTH;(Weiches Licht)\nIntensität @@ -1001,6 +1002,7 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Vorverarbeitung: Dead-Pixel-Filter PARTIALPASTE_PREPROCESS_GREENEQUIL;Vorverarbeitung: Grün-Ausgleich PARTIALPASTE_PREPROCESS_HOTPIXFILT;Vorverarbeitung: Hot-Pixel-Filter PARTIALPASTE_PREPROCESS_LINEDENOISE;Vorverarbeitung: Zeilenrauschfilter +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Vorverarbeitung: PDAF-Zeilenfilter PARTIALPASTE_PRSHARPENING;Schärfung nach Größenänderung PARTIALPASTE_RAWCACORR_AUTO;Chromatische Aberration: Automatische Korrektur PARTIALPASTE_RAWCACORR_CAREDBLUE;Chromatische Aberration: Rot & Blau @@ -1008,6 +1010,7 @@ PARTIALPASTE_RAWEXPOS_BLACK;Weißpunkt: Schwarzpegel PARTIALPASTE_RAWEXPOS_LINEAR;Weißpunkt: Korrekturfaktor PARTIALPASTE_RAWEXPOS_PRESER;Weißpunkt: Lichter schützen (EV) PARTIALPASTE_RAWGROUP;RAW +PARTIALPASTE_RAW_BORDER;Farbinterpolation: Bildrand PARTIALPASTE_RAW_DCBENHANCE;Farbinterpolation: DCB-Verbesserung PARTIALPASTE_RAW_DCBITERATIONS;Farbinterpolation: Anzahl der DCB-Iterationen PARTIALPASTE_RAW_DMETHOD;Farbinterpolation: Methode @@ -1927,6 +1930,7 @@ TP_RAW_SENSOR_BAYER_LABEL;Sensor mit Bayer-Matrix TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Mit “3-Pass“ erzielt man die besten Ergebnisse\n(empfohlen bei Bildern mit niedrigen ISO-Werten).\n\nBei hohen ISO-Werten unterscheidet sich “1-Pass“\nkaum gegenüber “3-Pass“, ist aber deutlich schneller.\n\n"+ schnell" erzeugt weniger Artefakte in kontrast-\narmen Bereichen. TP_RAW_SENSOR_XTRANS_LABEL;Sensor mit X-Trans-Matrix TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Hochskalieren zulassen TP_RESIZE_APPLIESTO;Anwenden auf: TP_RESIZE_CROPPEDAREA;Ausschnitt TP_RESIZE_FITBOX;Begrenzungsrahmen @@ -2314,11 +2318,3 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -HISTORY_MSG_RESIZE_ALLOW_UPSCALING;(Skalieren)\nHochskalieren zulassen -PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Vorverarbeitung: PDAF-Zeilenfilter -PARTIALPASTE_RAW_BORDER;Farbinterpolation: Bildrand -TP_RESIZE_ALLOW_UPSCALING;Hochskalieren zulassen diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 0f50b6147..a573146ab 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -771,7 +771,11 @@ HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - 振れに対するデモザイクの方式 HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;ラインノイズフィルタの方向 HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAFラインフィルタ HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - コントラストのしきい値 +HISTORY_MSG_RAW_BORDER;Rawの境界 +HISTORY_MSG_RESIZE_ALLOW_UPSCALING;リサイズ - アップスケーリングを可能にする HISTORY_MSG_SHARPENING_CONTRAST;シャープ化 - コントラストのしきい値 +HISTORY_MSG_SOFTLIGHT_ENABLED;ソフトな明るさ +HISTORY_MSG_SOFTLIGHT_STRENGTH;ソフトな明るさ - 強さ HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - アンカー HISTORY_NEWSNAPSHOT;追加 HISTORY_NEWSNAPSHOT_TOOLTIP;ショートカット: Alt-s @@ -892,6 +896,7 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;フォーカス・マスク表示\nショ MAIN_TOOLTIP_PREVIEWG;グリーン チャンネル表示\nショートカット: g MAIN_TOOLTIP_PREVIEWL;輝度表示\nショートカット: v\n\n0.299*R + 0.587*G + 0.114*B MAIN_TOOLTIP_PREVIEWR;レッド チャンネル表示\nショートカット: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;プレビューで見るシャープ化機能のコントラストマスク\nショートカット: なし\n\nこの機能が使えるのはシャープ化機能が有効で、画像が100%以上に拡大されている場合だけ MAIN_TOOLTIP_QINFO;画像の情報\nショートカット: i MAIN_TOOLTIP_SHOWHIDELP1;表示/非表示 左パネル\nショートカット: l MAIN_TOOLTIP_SHOWHIDERP1;表示/非表示 右パネル\nショートカット: Alt-l @@ -962,6 +967,7 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;デッドピクセルフィルターを適 PARTIALPASTE_PREPROCESS_GREENEQUIL;グリーン 平衡化 PARTIALPASTE_PREPROCESS_HOTPIXFILT;ホットピクセルフィルターを適用 PARTIALPASTE_PREPROCESS_LINEDENOISE;ラインノイズ フィルタ +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF ラインフィルタ PARTIALPASTE_PRSHARPENING;リサイズ後のシャープ化 PARTIALPASTE_RAWCACORR_AUTO;自動色収差補正 PARTIALPASTE_RAWCACORR_CAREDBLUE;色収差 レッドとブルー @@ -969,6 +975,7 @@ PARTIALPASTE_RAWEXPOS_BLACK;黒レベル PARTIALPASTE_RAWEXPOS_LINEAR;raw ホワイトポイント リニア補正係数 PARTIALPASTE_RAWEXPOS_PRESER;raw ホワイトポイント ハイライトを保持したまま補正 (EV) PARTIALPASTE_RAWGROUP;raw 設定 +PARTIALPASTE_RAW_BORDER;Rawの境界 PARTIALPASTE_RAW_DCBENHANCE;DCB 拡張処理適用 PARTIALPASTE_RAW_DCBITERATIONS;DCB反復の数 PARTIALPASTE_RAW_DMETHOD;デモザイクの方法 @@ -984,6 +991,7 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;シャドウ/ハイライト PARTIALPASTE_SHARPENEDGE;エッジ PARTIALPASTE_SHARPENING;シャープ化 (USM/RL) PARTIALPASTE_SHARPENMICRO;マイクロコントラスト +PARTIALPASTE_SOFTLIGHT;ソフトな明るさ PARTIALPASTE_TM_FATTAL;ダイナミックレンジ圧縮 PARTIALPASTE_VIBRANCE;自然な彩度 PARTIALPASTE_VIGNETTING;周辺光量補正 @@ -1794,14 +1802,17 @@ TP_RAWEXPOS_PRESER;ハイライトを保持 TP_RAWEXPOS_RGB;レッド、グリーン、ブルー TP_RAWEXPOS_TWOGREEN;2つのグリーンを連動 TP_RAW_1PASSMEDIUM;1-パス (ミディアム) +TP_RAW_2PASS;1-pass+fast TP_RAW_3PASSBEST;3-Pass (最良) TP_RAW_4PASS;4-パス TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;境界 TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;DCB 拡張処理 TP_RAW_DCBITERATIONS;DCB 反復の数 +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;方式 TP_RAW_DMETHOD_PROGRESSBAR;%1 デモザイク中... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;デモザイク・リファイン中... @@ -1853,10 +1864,12 @@ TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;デフォルトで設定している値1.0で基 TP_RAW_PIXELSHIFTSMOOTH;境界部分を滑らかにする TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;これは振れのある領域と振れがない領域の境を滑らかに補正するものです。\n0に設定すると機能の働きはありません。\n1に設定すると、選択された構成画像にAMaZEかLMMSEが使われた結果が得られます("LMMSEを使う"というオプション次第)、或いは"メディアンを使う"が選択されていれば全ての構成画像にメディアンが使われます。 TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;ベイヤー配列を使ったセンサー TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-passが最適です(低ISO画像には奨められます)\n高ISO画像の場合、1-passと3-passの違いは殆どありません、処理速度は前者の方が速いです。 TP_RAW_SENSOR_XTRANS_LABEL;X-Transマトリクスを使ったセンサー TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;アップスケーリングを可能にする TP_RESIZE_APPLIESTO;適用領域: TP_RESIZE_CROPPEDAREA;切り抜き画像 TP_RESIZE_FITBOX;バウンディング・ボックス @@ -1995,6 +2008,8 @@ TP_SHARPENMICRO_CONTRAST;コントラストのしきい値 TP_SHARPENMICRO_LABEL;マイクロコントラスト TP_SHARPENMICRO_MATRIX;3×3マトリクスの代わりに 5×5 TP_SHARPENMICRO_UNIFORMITY;均等 +TP_SOFTLIGHT_LABEL;ソフトな明るさ +TP_SOFTLIGHT_STRENGTH;強さ TP_TM_FATTAL_AMOUNT;量 TP_TM_FATTAL_ANCHOR;アンカー TP_TM_FATTAL_LABEL;ダイナミックレンジ圧縮 @@ -2242,22 +2257,3 @@ ZOOMPANEL_ZOOMFITSCREEN;画像全体を画面に合わせる\nショートカッ ZOOMPANEL_ZOOMIN;ズームイン\nショートカット: + ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!HISTORY_MSG_RAW_BORDER;Raw border -!HISTORY_MSG_RESIZE_ALLOW_UPSCALING;Resize - Allow upscaling -!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light -!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength -!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the Sharpening Contrast Mask.\nShortcut: None\n\nOnly works when sharpening is enabled and zoom >= 100%. -!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -!PARTIALPASTE_RAW_BORDER;Raw border -!PARTIALPASTE_SOFTLIGHT;Soft light -!TP_RAW_2PASS;1-pass+fast -!TP_RAW_BORDER;Border -!TP_RAW_DCBVNG4;DCB+VNG4 -!TP_RAW_RCDVNG4;RCD+VNG4 -!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling -!TP_SOFTLIGHT_LABEL;Soft Light -!TP_SOFTLIGHT_STRENGTH;Strength From eedad21326328321150fcbaf773f982a10403f47 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 10 Jul 2018 11:05:35 +0200 Subject: [PATCH 5/5] histmatching: use the same amount of pixels for the matching regardless of the image orientation --- rtengine/histmatching.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 5db504816..de02881b6 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -51,7 +51,7 @@ CdfInfo getCdf(const IImage8 &img) for (int y = 0; y < img.getHeight(); ++y) { for (int x = 0; x < img.getWidth(); ++x) { - int lum = LIM(0, int(Color::rgbLuminance(float(img.r(y, x)), float(img.g(y, x)), float(img.b(y, x)))), 255); + int lum = LIM(int(Color::rgbLuminance(float(img.r(y, x)), float(img.g(y, x)), float(img.b(y, x)))), 0, 255); ++ret.cdf[lum]; } } @@ -206,6 +206,9 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st int fw, fh; getFullSize(fw, fh, TR_NONE); + if (getRotateDegree() == 90 || getRotateDegree() == 270) { + std::swap(fw, fh); + } int skip = 3; if (settings->verbose) {