From 93adb22632e7e07d4a3dfb042bf3f26e430ba954 Mon Sep 17 00:00:00 2001 From: Mirco Miranda Date: Wed, 17 May 2023 17:45:23 +0000 Subject: [PATCH] raw: change the use of the quality parameter - Standardized the quality parameter between 0-100 - The value -1 is the default value of Qt plugins and is managed - Negative values other than -1 are used as flags to activate the custom mode --- src/imageformats/raw.cpp | 82 ++++++++++++++++++++-------------------- src/imageformats/raw_p.h | 38 +++++++++---------- 2 files changed, 57 insertions(+), 63 deletions(-) diff --git a/src/imageformats/raw.cpp b/src/imageformats/raw.cpp index 9d409df..b097889 100644 --- a/src/imageformats/raw.cpp +++ b/src/imageformats/raw.cpp @@ -418,7 +418,7 @@ inline void rgbToRgbX(uchar *target, const uchar *source, qint32 targetSize, qin #define C_NR(a) (((a) & 0x3) << 17) #define C_FC(a) (((a) & 0x1) << 19) #define C_SR(a) (((a) & 0x1) << 20) -#define C_PRESET(a) ((a) & 0xF) +#define C_FLAGS(a) (((a) & 0x1) << 31) // flags mode #define T_IQ(a) (((a) >> 4) & 0xF) #define T_OC(a) (((a) >> 8) & 0xF) @@ -430,10 +430,10 @@ inline void rgbToRgbX(uchar *target, const uchar *source, qint32 targetSize, qin #define T_NR(a) (((a) >> 17) & 0x3) #define T_FC(a) (((a) >> 19) & 0x1) #define T_SR(a) (((a) >> 20) & 0x1) -#define T_PRESET(a) ((a) & 0xF) +#define T_FLAGS(a) (((a) >> 31) & 0x1) // clang-format on -#define DEFAULT_QUALITY (C_IQ(3) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0)) +#define DEFAULT_QUALITY (C_IQ(3) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0) | C_FLAGS(1)) void setParams(QImageIOHandler *handler, LibRaw *rawProcessor) { @@ -459,47 +459,45 @@ void setParams(QImageIOHandler *handler, LibRaw *rawProcessor) if (handler->supportsOption(QImageIOHandler::Quality)) { quality = handler->option(QImageIOHandler::Quality).toInt(); } - if (quality < 0) { + if (quality > -1) { + switch (quality / 10) { + case 0: + quality = C_IQ(0) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(0) | C_HS(1); + break; + case 1: + quality = C_IQ(0) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(0) | C_HS(0); + break; + case 2: + quality = C_IQ(3) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(0) | C_HS(0); + break; + case 3: + quality = C_IQ(3) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); + break; + case 4: + quality = C_IQ(3) | C_OC(2) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); + break; + case 5: + quality = C_IQ(3) | C_OC(4) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); + break; + case 6: + quality = C_IQ(11) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(0) | C_HS(0); + break; + case 7: + quality = C_IQ(11) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); + break; + case 8: + quality = C_IQ(11) | C_OC(2) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); + break; + default: + quality = C_IQ(11) | C_OC(4) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); + break; + } + quality |= C_FLAGS(1); + } + if (quality == -1) { quality = DEFAULT_QUALITY; } - - switch (T_PRESET(quality)) { - case 0: - break; - case 1: - quality = C_IQ(0) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(0) | C_HS(1); - break; - case 2: - quality = C_IQ(0) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(0) | C_HS(0); - break; - case 3: - quality = C_IQ(3) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(0) | C_HS(0); - break; - case 4: - quality = C_IQ(3) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); - break; - case 5: - quality = C_IQ(3) | C_OC(2) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); - break; - case 6: - quality = C_IQ(3) | C_OC(4) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); - break; - case 7: - quality = C_IQ(11) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(0) | C_HS(0); - break; - case 8: - quality = C_IQ(11) | C_OC(1) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); - break; - case 9: - quality = C_IQ(11) | C_OC(2) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); - break; - case 10: - quality = C_IQ(11) | C_OC(4) | C_CW(1) | C_AW(1) | C_BT(1) | C_HS(0); - break; - default: - quality = DEFAULT_QUALITY; - break; - } + Q_ASSERT(T_FLAGS(quality)); auto &¶ms = rawProcessor->imgdata.params; diff --git a/src/imageformats/raw_p.h b/src/imageformats/raw_p.h index 30e8357..1f3aab7 100644 --- a/src/imageformats/raw_p.h +++ b/src/imageformats/raw_p.h @@ -40,30 +40,13 @@ private: * Change the quality of the conversion. If -1, default quality is used. * @note Verify that the quality change support has been compiled with supportsOption() * + * When the quality value is negative (but not -1), we assume we want to work with flags according to the following scheme: * 3 2 1 0 * 1 0 9 8 7 6 5 4 3 2 1 0 9 87 6 5 4 3 2 1098 7654 3210 - * _ _ _ _ _ _ _ _ _ _ _ S F NN E H B A W CCCC IIII PPPP + * 1 _ _ _ _ _ _ _ _ _ _ S F NN E H B A W CCCC IIII ____ * * Where: - * - * _: reserved - * P: preset values: *** if set, other flags are ignored! *** - * - 0: Use other flags (no preset) - * - 1: I = 0, C = 1, B = 0, W = 1, A = 1, H = 1 (Linear, sRGB, 8-bits, Camera White, Auto White, Half-size) - * - 2: I = 0, C = 1, B = 0, W = 1, A = 1, H = 0 (Linear, sRGB, 8-bits, Camera White, Auto White) - * - 3: I = 3, C = 1, B = 0, W = 1, A = 1, H = 0 (AHD, sRGB, 8-bits, Camera White, Auto White) - * - 4: I = 3, C = 1, B = 1, W = 1, A = 1, H = 0 (AHD, sRGB, 16-bits, Camera White, Auto White) - * - 5: I = 3, C = 2, B = 1, W = 1, A = 1, H = 0 (AHD, Adobe, 16-bits, Camera White, Auto White) - * - 6: I = 3, C = 4, B = 1, W = 1, A = 1, H = 0 (AHD, ProPhoto, 16-bits, Camera White, Auto White) - * - 7: I = 11, C = 1, B = 0, W = 1, A = 1, H = 0 (DHT, sRGB, 8-bits, Camera White, Auto White) - * - 8: I = 11, C = 1, B = 1, W = 1, A = 1, H = 0 (DHT, sRGB, 16-bits, Camera White, Auto White) - * - 9: I = 11, C = 2, B = 1, W = 1, A = 1, H = 0 (DHT, Adobe, 16-bits, Camera White, Auto White) - * - 10: I = 11, C = 4, B = 1, W = 1, A = 1, H = 0 (DHT, ProPhoto, 16-bits, Camera White, Auto White) - * - 11: reserved - * - 12: reserved - * - 13: reserved - * - 14: reserved - * - 15: reserved + * _: reserved (should be zero) * I: interpolation quality (0 - linear, 1 - VNG, 2 - PPG, 3 - AHD, 4 - DCB, 11 - DHT, 12 - AAHD) * C: output colorspace (0 - raw, 1 - sRGB, 2 - Adobe, 3 - Wide, 4 - ProPhoto, 5 - XYZ, 6 - ACES, 7 - DCI-P3, 8 - Rec2020) * W: use camera white balace (0 - off, 1 - on) @@ -74,8 +57,21 @@ private: * N: FBDD noise reduction (0 - off, 1 - light, 2 - full) * F: Interpolate RGGB as four colors (0 - off, 1 - on) * S: Don't stretch or rotate raw pixels (0 - rotate and stretch, 1 - don't rotate and stretch) - * * @note It is safe to set both W and A: W is used if camera white balance is found, otherwise A is used. + * + * When quality is a positive value, a value between 0 and 100 is expected. The values are interpreted as follows: + * - 00-09: I = 0, C = 1, B = 0, W = 1, A = 1, H = 1 (Linear, sRGB, 8-bits, Camera White, Auto White, Half-size) + * - 10-19: I = 0, C = 1, B = 0, W = 1, A = 1, H = 0 (Linear, sRGB, 8-bits, Camera White, Auto White) + * - 20-29: I = 3, C = 1, B = 0, W = 1, A = 1, H = 0 (AHD, sRGB, 8-bits, Camera White, Auto White) + * - 30-39: I = 3, C = 1, B = 1, W = 1, A = 1, H = 0 (AHD, sRGB, 16-bits, Camera White, Auto White) [Default] + * - 40-49: I = 3, C = 2, B = 1, W = 1, A = 1, H = 0 (AHD, Adobe, 16-bits, Camera White, Auto White) + * - 50-59: I = 3, C = 4, B = 1, W = 1, A = 1, H = 0 (AHD, ProPhoto, 16-bits, Camera White, Auto White) + * - 60-69: I = 11, C = 1, B = 0, W = 1, A = 1, H = 0 (DHT, sRGB, 8-bits, Camera White, Auto White) + * - 70-79: I = 11, C = 1, B = 1, W = 1, A = 1, H = 0 (DHT, sRGB, 16-bits, Camera White, Auto White) + * - 80-89: I = 11, C = 2, B = 1, W = 1, A = 1, H = 0 (DHT, Adobe, 16-bits, Camera White, Auto White) + * - >= 90: I = 11, C = 4, B = 1, W = 1, A = 1, H = 0 (DHT, ProPhoto, 16-bits, Camera White, Auto White) + * + * When the quality is -1, default quality is used. */ qint32 m_quality; };