From 91dc97eafb929ab3b658b854847dbe553feaae29 Mon Sep 17 00:00:00 2001 From: Andy Dodd Date: Sun, 17 Mar 2024 09:49:42 -0400 Subject: [PATCH 01/78] Fix regression with demosaiced DNGs caused by 831a9bbd Uses a new function checkRawDataDimensions as suggested/written by @Lawrence37 to verify that image dimensions are correct. Fixes #6996 --- rtengine/rawimagesource.cc | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 8149c0464..03823644b 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -742,9 +742,19 @@ void RawImageSource::getWBMults(const ColorTemp &ctemp, const RAWParams &raw, st autoGainComp = camInitialGain / initialGain; } +bool checkRawDataDimensions(const array2D &rawData, const RawImage &rawImage, int width, int height) +{ + const int colors = (rawImage.getSensorType() == rtengine::ST_BAYER || + rawImage.getSensorType() == rtengine::ST_FUJI_XTRANS || + rawImage.get_colors() == 1) + ? 1 + : 3; + return rawData.getHeight() == height && rawData.getWidth() == colors * width; +} + void RawImageSource::getImage(const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); MyMutex::MyLock lock(getImageMutex); @@ -1747,7 +1757,7 @@ void RawImageSource::preprocess(const RAWParams &raw, const LensProfParams &lens void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); MyTime t1, t2; t1.set(); @@ -3842,7 +3852,7 @@ void RawImageSource::hlRecovery(const std::string &method, float* red, float* gr void RawImageSource::getAutoExpHistogram(LUTu & histogram, int& histcompr) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); // BENCHFUN histcompr = 3; @@ -7487,7 +7497,7 @@ void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int void RawImageSource::getAutoWBMultipliersitc(bool extra, double & tempref, double & greenref, double & tempitc, double & greenitc, float &temp0, float &delta, int &bia, int &dread, int &kcam, int &nocam, float &studgood, float &minchrom, int &kmin, float &minhist, float &maxhist, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double & rm, double & gm, double & bm, const WBParams & wbpar, const ColorManagementParams & cmp, const RAWParams & raw, const ToneCurveParams &hrp) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); // BENCHFUN constexpr double clipHigh = 64000.0; @@ -7713,7 +7723,7 @@ void RawImageSource::getAutoWBMultipliersitc(bool extra, double & tempref, doubl void RawImageSource::getAutoWBMultipliers(double &rm, double &gm, double &bm) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); // BENCHFUN constexpr double clipHigh = 64000.0; @@ -7931,7 +7941,7 @@ void RawImageSource::getAutoWBMultipliers(double &rm, double &gm, double &bm) ColorTemp RawImageSource::getSpotWB(std::vector &red, std::vector &green, std::vector &blue, int tran, double equal, StandardObserver observer) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); int x; int y; @@ -8271,7 +8281,7 @@ void RawImageSource::init() void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int &B) { - if (rawData.getWidth() != W || rawData.getHeight() != H || d1x) { // Nikon D1x has special sensor. We just skip it + if (!checkRawDataDimensions(rawData, *ri, W, H) || d1x) { // Nikon D1x has special sensor. We just skip it R = G = B = 0; return; } @@ -8319,7 +8329,7 @@ bool RawImageSource::isGainMapSupported() const void RawImageSource::applyDngGainMap(const float black[4], const std::vector &gainMaps) { - assert(rawData.getHeight() == H && rawData.getWidth() == W); + assert(checkRawDataDimensions(rawData, *ri, W, H)); // now we can apply each gain map to raw_data array2D mvals[2][2]; From 13eddbdd94f1e220ca818ded02341d341e28dbdc Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Fri, 22 Mar 2024 13:49:31 +0100 Subject: [PATCH 02/78] dcraw: handle fujifilm lossy compression port from libraw handling of fujifilm lossy compression. --- rtengine/dcraw.h | 43 +++- rtengine/fujicompressed.cc | 491 ++++++++++++++++++++++++------------- 2 files changed, 354 insertions(+), 180 deletions(-) diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index f932e2472..eaf87d618 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -109,16 +109,24 @@ protected: unsigned black, cblack[4102], maximum, mix_green, raw_color, zero_is_bad; unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error; unsigned tile_width, tile_length, gpsdata[32], load_flags, row_padding; - bool xtransCompressed = false; + + struct fuji_q_table + { + int8_t *q_table; /* quantization table */ + int raw_bits; + int total_values; + int max_grad; // sdp val + int q_grad_mult; // quant_gradient multiplier + int q_base; + }; + struct fuji_compressed_params { - char *q_table; /* quantization table */ - int q_point[5]; /* quantization points */ + struct fuji_q_table qt[4]; + void *buf; int max_bits; int min_value; - int raw_bits; - int total_values; - int maxDiff; + int max_value; ushort line_width; }; @@ -135,6 +143,13 @@ protected: _ltotal }; + // tables of gradients for single sample level + struct fuji_grads + { + int_pair grads[41]; + int_pair lossy_grads[3][5]; + }; + struct fuji_compressed_block { int cur_bit; // current bit being read (from left to right) int cur_pos; // current position in a buffer @@ -144,13 +159,13 @@ protected: uchar *cur_buf; // currently read block int fillbytes; // Counter to add extra byte for block size N*16 rtengine::IMFILE *input; - struct int_pair grad_even[3][41]; // tables of gradients - struct int_pair grad_odd[3][41]; + fuji_grads even[3]; // tables of even gradients + fuji_grads odd[3]; // tables of odd gradients ushort *linealloc; ushort *linebuf[_ltotal]; }; - int fuji_total_lines, fuji_total_blocks, fuji_block_width, fuji_bits, fuji_raw_type; + int fuji_total_lines, fuji_total_blocks, fuji_block_width, fuji_bits, fuji_raw_type, fuji_lossless; ushort raw_height, raw_width, height, width, top_margin, left_margin; ushort shrink, iheight, iwidth, fuji_width, thumb_width, thumb_height; @@ -374,6 +389,8 @@ void adobe_copy_pixel (unsigned row, unsigned col, ushort **rp); void lossless_dng_load_raw(); void packed_dng_load_raw(); void deflate_dng_load_raw(); +void init_fuji_main_qtable(fuji_compressed_params *params, uchar q_base); +void init_fuji_main_grads(const fuji_compressed_params *params, fuji_compressed_block *info); void init_fuji_compr(struct fuji_compressed_params* info); void fuji_fill_buffer(struct fuji_compressed_block *info); void init_fuji_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params, INT64 raw_offset, unsigned dsize); @@ -381,8 +398,8 @@ void copy_line_to_xtrans(struct fuji_compressed_block* info, int cur_line, int c void copy_line_to_bayer(struct fuji_compressed_block* info, int cur_line, int cur_block, int cur_block_width); void fuji_zerobits(struct fuji_compressed_block* info, int *count); void fuji_read_code(struct fuji_compressed_block* info, int *data, int bits_to_read); -int fuji_decode_sample_even(struct fuji_compressed_block* info, const struct fuji_compressed_params * params, ushort* line_buf, int pos, struct int_pair* grads); -int fuji_decode_sample_odd(struct fuji_compressed_block* info, const struct fuji_compressed_params * params, ushort* line_buf, int pos, struct int_pair* grads); +int fuji_decode_sample_even(struct fuji_compressed_block* info, const struct fuji_compressed_params* params, ushort* line_buf, int pos, struct fuji_grads* grad_params); +int fuji_decode_sample_odd(struct fuji_compressed_block* info, const struct fuji_compressed_params* params, ushort* line_buf, int pos, struct fuji_grads* grad_params); void fuji_decode_interpolation_even(int line_width, ushort* line_buf, int pos); void fuji_extend_generic(ushort *linebuf[_ltotal], int line_width, int start, int end); void fuji_extend_red(ushort *linebuf[_ltotal], int line_width); @@ -390,9 +407,9 @@ void fuji_extend_green(ushort *linebuf[_ltotal], int line_width); void fuji_extend_blue(ushort *linebuf[_ltotal], int line_width); void xtrans_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params); void fuji_bayer_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params); -void fuji_decode_strip(const struct fuji_compressed_params* info_common, int cur_block, INT64 raw_offset, unsigned dsize); +void fuji_decode_strip (fuji_compressed_params* params, int cur_block, INT64 raw_offset, unsigned dsize, uchar *q_bases); void fuji_compressed_load_raw(); -void fuji_decode_loop(const struct fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes); +void fuji_decode_loop(fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes, uchar *q_bases); void parse_fuji_compressed_header(); void fuji_14bit_load_raw(); void pentax_load_raw(); diff --git a/rtengine/fujicompressed.cc b/rtengine/fujicompressed.cc index c1c620657..0bae92356 100644 --- a/rtengine/fujicompressed.cc +++ b/rtengine/fujicompressed.cc @@ -31,75 +31,164 @@ int bitDiff (int value1, int value2) return decBits; } +static inline int log2ceil(int val) +{ + int result = 0; + if (val--) + do + ++result; + while (val >>= 1); + + return result; } -void CLASS init_fuji_compr (struct fuji_compressed_params* info) +void setup_qlut(int8_t *qt, int *q_point) { - int cur_val; - char *qt; + for (int curVal = -q_point[4]; curVal <= q_point[4]; ++qt, ++curVal) + { + if (curVal <= -q_point[3]) + *qt = -4; + else if (curVal <= -q_point[2]) + *qt = -3; + else if (curVal <= -q_point[1]) + *qt = -2; + else if (curVal < -q_point[0]) + *qt = -1; + else if (curVal <= q_point[0]) + *qt = 0; + else if (curVal < q_point[1]) + *qt = 1; + else if (curVal < q_point[2]) + *qt = 2; + else if (curVal < q_point[3]) + *qt = 3; + else + *qt = 4; + } +} +} // namespace + +void CLASS init_fuji_main_qtable(fuji_compressed_params *params, uchar q_base) +{ + fuji_q_table *qt = params->qt; + int qp[5]; + int maxVal = params->max_value + 1; + qp[0] = q_base; + qp[1] = 3 * q_base + 0x12; + qp[2] = 5 * q_base + 0x43; + qp[3] = 7 * q_base + 0x114; + qp[4] = params->max_value; + if (qp[1] >= maxVal || qp[1] < q_base + 1) + qp[1] = q_base + 1; + if (qp[2] < qp[1] || qp[2] >= maxVal) + qp[2] = qp[1]; + if (qp[3] < qp[2] || qp[3] >= maxVal) + qp[3] = qp[2]; + setup_qlut(qt->q_table, qp); + qt->q_base = q_base; + qt->max_grad = 0; + qt->total_values = (qp[4] + 2 * q_base) / (2 * q_base + 1) + 1; + qt->raw_bits = log2ceil(qt->total_values); + qt->q_grad_mult = 9; + params->max_bits = 4 * log2ceil(qp[4] + 1); +} + +void CLASS init_fuji_main_grads(const fuji_compressed_params *params, fuji_compressed_block *info) +{ + int max_diff = std::max(2, (params->qt->total_values + 0x20) >> 6); + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 41; i++) { + info->even[j].grads[i].value1 = max_diff; + info->even[j].grads[i].value2 = 1; + info->odd[j].grads[i].value1 = max_diff; + info->odd[j].grads[i].value2 = 1; + } + } +} + +void CLASS init_fuji_compr (struct fuji_compressed_params* params) +{ if ((fuji_block_width % 3 && fuji_raw_type == 16) || (fuji_block_width & 1 && fuji_raw_type == 0)) { derror(); } - info->q_table = (char *) malloc (2 << fuji_bits); - merror (info->q_table, "init_fuji_compr()"); + size_t q_table_size = 2 << fuji_bits; + if (fuji_lossless) { + params->buf = malloc(q_table_size); + } else { + params->buf = malloc(3 * q_table_size); + } + merror (params->buf, "init_fuji_compr()"); if (fuji_raw_type == 16) { - info->line_width = (fuji_block_width * 2) / 3; + params->line_width = (fuji_block_width * 2) / 3; } else { - info->line_width = fuji_block_width >> 1; + params->line_width = fuji_block_width >> 1; } - info->q_point[0] = 0; - info->q_point[1] = 0x12; - info->q_point[2] = 0x43; - info->q_point[3] = 0x114; - info->q_point[4] = (1 << fuji_bits) - 1; - info->min_value = 0x40; + params->min_value = 0x40; + params->max_value = (1 << fuji_bits) - 1; - cur_val = -info->q_point[4]; - - for (qt = info->q_table; cur_val <= info->q_point[4]; ++qt, ++cur_val) { - if (cur_val <= -info->q_point[3]) { - *qt = -4; - } else if (cur_val <= -info->q_point[2]) { - *qt = -3; - } else if (cur_val <= -info->q_point[1]) { - *qt = -2; - } else if (cur_val < 0) { - *qt = -1; - } else if (cur_val == 0) { - *qt = 0; - } else if (cur_val < info->q_point[1]) { - *qt = 1; - } else if (cur_val < info->q_point[2]) { - *qt = 2; - } else if (cur_val < info->q_point[3]) { - *qt = 3; - } else { - *qt = 4; - } + // setup qtables + if (fuji_lossless) + { + // setup main qtable only, zero the rest + memset(params->qt + 1, 0, 3 * sizeof(fuji_q_table)); + params->qt[0].q_table = (int8_t *)params->buf; + params->qt[0].q_base = -1; + init_fuji_main_qtable(params, 0); } + else + { + // setup 3 extra qtables - main one will be set for each block + memset(params->qt, 0, sizeof(fuji_q_table)); + int qp[5]; - // populting gradients - //if (info->q_point[4] == 0x3FFF) { - // info->total_values = 0x4000; - // info->raw_bits = 14; - // info->max_bits = 56; - // info->maxDiff = 256; - //} else if (info->q_point[4] == 0xFFF) { - // info->total_values = 4096; - // info->raw_bits = 12; - // info->max_bits = 48; - // info->maxDiff = 64; - //} else { - // derror(); - //} - info->total_values = (1 << fuji_bits); - info->raw_bits = fuji_bits; - info->max_bits = 4 * info->raw_bits; - info->maxDiff = info->total_values >> 6; + qp[0] = 0; + qp[4] = params->max_value; + + // table 0 + params->qt[1].q_table = (int8_t *)params->buf; + params->qt[1].q_base = 0; + params->qt[1].max_grad = 5; + params->qt[1].q_grad_mult = 3; + params->qt[1].total_values = qp[4] + 1; + params->qt[1].raw_bits = log2ceil(params->qt[1].total_values); + + qp[1] = qp[4] >= 0x12 ? 0x12 : qp[0] + 1; + qp[2] = qp[4] >= 0x43 ? 0x43 : qp[1]; + qp[3] = qp[4] >= 0x114 ? 0x114 : qp[2]; + setup_qlut(params->qt[1].q_table, qp); + + // table 1 + params->qt[2].q_table = params->qt[1].q_table + q_table_size; + params->qt[2].q_base = 1; + params->qt[2].max_grad = 6; + params->qt[2].q_grad_mult = 3; + params->qt[2].total_values = (qp[4] + 2) / 3 + 1; + params->qt[2].raw_bits = log2ceil(params->qt[2].total_values); + + qp[0] = params->qt[2].q_base; + qp[1] = qp[4] >= 0x15 ? 0x15 : qp[0] + 1; + qp[2] = qp[4] >= 0x48 ? 0x48 : qp[1]; + qp[3] = qp[4] >= 0x11B ? 0x11B : qp[2]; + setup_qlut(params->qt[2].q_table, qp); + + // table 2 + params->qt[3].q_table = params->qt[2].q_table + q_table_size; + params->qt[3].q_base = 2; + params->qt[3].max_grad = 7; + params->qt[3].q_grad_mult = 3; + params->qt[3].total_values = (qp[4] + 4) / 5 + 1; + params->qt[3].raw_bits = log2ceil(params->qt[3].total_values); + + qp[0] = params->qt[3].q_base; + qp[1] = qp[4] >= 0x18 ? 0x18 : qp[0] + 1; + qp[2] = qp[4] >= 0x4D ? 0x4D : qp[1]; + qp[3] = qp[4] >= 0x122 ? 0x122 : qp[2]; + setup_qlut(params->qt[3].q_table, qp); + } } #define FUJI_BUF_SIZE 0x10000u @@ -157,17 +246,26 @@ void CLASS init_fuji_block (struct fuji_compressed_block* info, const struct fuj info->cur_bit = 0; info->cur_pos = 0; info->cur_buf_offset = raw_offset; - - for (int j = 0; j < 3; j++) - for (int i = 0; i < 41; i++) { - info->grad_even[j][i].value1 = params->maxDiff; - info->grad_even[j][i].value2 = 1; - info->grad_odd[j][i].value1 = params->maxDiff; - info->grad_odd[j][i].value2 = 1; - } - info->cur_buf_size = 0; fuji_fill_buffer (info); + + // init grads for lossy and lossless + if (fuji_lossless) { + init_fuji_main_grads(params, info); + } else { + // init static grads for lossy only - main ones are done per line + for (int k = 0; k < 3; ++k) { + int max_diff = std::max(2, ((params->qt[k + 1].total_values + 0x20) >> 6)); + for (int j = 0; j < 3; ++j) { + for (int i = 0; i < 5; ++i) { + info->even[j].lossy_grads[k][i].value1 = max_diff; + info->even[j].lossy_grads[k][i].value2 = 1; + info->odd[j].lossy_grads[k][i].value1 = max_diff; + info->odd[j].lossy_grads[k][i].value2 = 1; + } + } + } + } } void CLASS copy_line_to_xtrans (struct fuji_compressed_block* info, int cur_line, int cur_block, int cur_block_width) @@ -278,7 +376,7 @@ void CLASS copy_line_to_bayer (struct fuji_compressed_block *info, int cur_line, } -#define fuji_quant_gradient(i,v1,v2) (9*i->q_table[i->q_point[4]+(v1)] + i->q_table[i->q_point[4]+(v2)]) +#define fuji_quant_gradient(max, q, v1, v2) (q->q_grad_mult * q->q_table[(max) + (v1)] + q->q_table[(max) + (v2)]) inline void CLASS fuji_zerobits (struct fuji_compressed_block* info, int *count) { @@ -340,7 +438,7 @@ inline void CLASS fuji_read_code (struct fuji_compressed_block* info, int *data, info->cur_bit = (8 - (bits_left_in_byte & 7)) & 7; } -int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const struct fuji_compressed_params * params, ushort* line_buf, int pos, struct int_pair* grads) +int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const struct fuji_compressed_params* params, ushort* line_buf, int pos, struct fuji_grads* grad_params) { int interp_val = 0; int errcnt = 0; @@ -354,11 +452,22 @@ int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const str int grad, gradient, diffRcRb, diffRfRb, diffRdRb; - grad = fuji_quant_gradient (params, Rb - Rf, Rc - Rb); - gradient = std::abs (grad); - diffRcRb = std::abs (Rc - Rb); - diffRfRb = std::abs (Rf - Rb); - diffRdRb = std::abs (Rd - Rb); + diffRcRb = std::abs(Rc - Rb); + diffRfRb = std::abs(Rf - Rb); + diffRdRb = std::abs(Rd - Rb); + + const fuji_q_table *qt = params->qt; + int_pair *grads = grad_params->grads; + for (int i = 1; params->qt[0].q_base >= i && i < 4; ++i) { + if (diffRfRb + diffRcRb <= params->qt[i].max_grad) { + qt = params->qt + i; + grads = grad_params->lossy_grads[i - 1]; + break; + } + } + + grad = fuji_quant_gradient(params->max_value, qt, Rb - Rf, Rc - Rb); + gradient = std::abs(grad); if ( diffRcRb > diffRfRb && diffRcRb > diffRdRb ) { interp_val = Rf + Rd + 2 * Rb; @@ -371,16 +480,16 @@ int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const str fuji_zerobits (info, &sample); - if (sample < params->max_bits - params->raw_bits - 1) { + if (sample < params->max_bits - qt->raw_bits - 1) { int decBits = bitDiff (grads[gradient].value1, grads[gradient].value2); fuji_read_code (info, &code, decBits); code += sample << decBits; } else { - fuji_read_code (info, &code, params->raw_bits); + fuji_read_code (info, &code, qt->raw_bits); code++; } - if (code < 0 || code >= params->total_values) { + if (code < 0 || code >= qt->total_values) { errcnt++; } @@ -400,19 +509,19 @@ int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const str grads[gradient].value2++; if (grad < 0) { - interp_val = (interp_val >> 2) - code; + interp_val = (interp_val >> 2) - code * (2 * qt->q_base + 1); } else { - interp_val = (interp_val >> 2) + code; + interp_val = (interp_val >> 2) + code * (2 * qt->q_base + 1); } - if ( interp_val < 0 ) { - interp_val += params->total_values; - } else if (interp_val > params->q_point[4]) { - interp_val -= params->total_values; + if (interp_val < -qt->q_base) { + interp_val += qt->total_values * (2 * qt->q_base + 1); + } else if (interp_val > qt->q_base + params->max_value) { + interp_val -= qt->total_values * (2 * qt->q_base + 1); } - if ( interp_val >= 0 ) { - line_buf_cur[0] = std::min (interp_val, params->q_point[4]); + if (interp_val >= 0) { + line_buf_cur[0] = std::min(interp_val, params->max_value); } else { line_buf_cur[0] = 0; } @@ -420,7 +529,7 @@ int CLASS fuji_decode_sample_even (struct fuji_compressed_block* info, const str return errcnt; } -int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const struct fuji_compressed_params * params, ushort* line_buf, int pos, struct int_pair* grads) +int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const struct fuji_compressed_params* params, ushort* line_buf, int pos, struct fuji_grads* grad_params) { int interp_val = 0; int errcnt = 0; @@ -435,7 +544,20 @@ int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const stru int grad, gradient; - grad = fuji_quant_gradient (params, Rb - Rc, Rc - Ra); + int diffRcRa = std::abs(Rc - Ra); + int diffRbRc = std::abs(Rb - Rc); + + const fuji_q_table *qt = params->qt; + int_pair *grads = grad_params->grads; + for (int i = 1; params->qt[0].q_base >= i && i < 4; ++i) + if (diffRbRc + diffRcRa <= params->qt[i].max_grad) + { + qt = params->qt + i; + grads = grad_params->lossy_grads[i - 1]; + break; + } + + grad = fuji_quant_gradient(params->max_value, qt, Rb - Rc, Rc - Ra); gradient = std::abs (grad); if ((Rb > Rc && Rb > Rd) || (Rb < Rc && Rb < Rd)) { @@ -446,16 +568,16 @@ int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const stru fuji_zerobits (info, &sample); - if (sample < params->max_bits - params->raw_bits - 1) { + if (sample < params->max_bits - qt->raw_bits - 1) { int decBits = bitDiff (grads[gradient].value1, grads[gradient].value2); fuji_read_code (info, &code, decBits); code += sample << decBits; } else { - fuji_read_code (info, &code, params->raw_bits); + fuji_read_code (info, &code, qt->raw_bits); code++; } - if (code < 0 || code >= params->total_values) { + if (code < 0 || code >= qt->total_values) { errcnt++; } @@ -475,19 +597,19 @@ int CLASS fuji_decode_sample_odd (struct fuji_compressed_block* info, const stru grads[gradient].value2++; if (grad < 0) { - interp_val -= code; + interp_val -= code * (2 * qt->q_base + 1); } else { - interp_val += code; + interp_val += code * (2 * qt->q_base + 1); } - if ( interp_val < 0 ) { - interp_val += params->total_values; - } else if (interp_val > params->q_point[4]) { - interp_val -= params->total_values; + if (interp_val < -qt->q_base) { + interp_val += qt->total_values * (2 * qt->q_base + 1); + } else if (interp_val > qt->q_base + params->max_value) { + interp_val -= qt->total_values * (2 * qt->q_base + 1); } - if ( interp_val >= 0 ) { - line_buf_cur[0] = std::min (interp_val, params->q_point[4]); + if (interp_val >= 0) { + line_buf_cur[0] = std::min(interp_val, params->max_value); } else { line_buf_cur[0] = 0; } @@ -552,14 +674,14 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct if (g_even_pos < line_width) { fuji_decode_interpolation_even (line_width, info->linebuf[_R2] + 1, r_even_pos); r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G2] + 1, g_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G2] + 1, g_even_pos, &info->even[0]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R2] + 1, r_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R2] + 1, r_odd_pos, &info->odd[0]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G2] + 1, g_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G2] + 1, g_odd_pos, &info->odd[0]); g_odd_pos += 2; } } @@ -571,16 +693,16 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G3] + 1, g_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G3] + 1, g_even_pos, &info->even[1]); g_even_pos += 2; fuji_decode_interpolation_even (line_width, info->linebuf[_B2] + 1, b_even_pos); b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G3] + 1, g_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G3] + 1, g_odd_pos, &info->odd[1]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B2] + 1, b_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B2] + 1, b_odd_pos, &info->odd[1]); b_odd_pos += 2; } } @@ -594,7 +716,7 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { if (r_even_pos & 3) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R3] + 1, r_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R3] + 1, r_even_pos, &info->even[2]); } else { fuji_decode_interpolation_even (line_width, info->linebuf[_R3] + 1, r_even_pos); } @@ -605,9 +727,9 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R3] + 1, r_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R3] + 1, r_odd_pos, &info->odd[2]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G4] + 1, g_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G4] + 1, g_odd_pos, &info->odd[2]); g_odd_pos += 2; } } @@ -620,22 +742,22 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G5] + 1, g_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G5] + 1, g_even_pos, &info->even[0]); g_even_pos += 2; if ((b_even_pos & 3) == 2) { fuji_decode_interpolation_even (line_width, info->linebuf[_B3] + 1, b_even_pos); } else { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B3] + 1, b_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B3] + 1, b_even_pos, &info->even[0]); } b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G5] + 1, g_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G5] + 1, g_odd_pos, &info->odd[0]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B3] + 1, b_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B3] + 1, b_odd_pos, &info->odd[0]); b_odd_pos += 2; } } @@ -651,18 +773,18 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct if ((r_even_pos & 3) == 2) { fuji_decode_interpolation_even (line_width, info->linebuf[_R4] + 1, r_even_pos); } else { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R4] + 1, r_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R4] + 1, r_even_pos, &info->even[1]); } r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G6] + 1, g_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G6] + 1, g_even_pos, &info->even[1]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R4] + 1, r_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R4] + 1, r_odd_pos, &info->odd[1]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G6] + 1, g_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G6] + 1, g_odd_pos, &info->odd[1]); g_odd_pos += 2; } } @@ -679,7 +801,7 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct g_even_pos += 2; if (b_even_pos & 3) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B4] + 1, b_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B4] + 1, b_even_pos, &info->even[2]); } else { fuji_decode_interpolation_even (line_width, info->linebuf[_B4] + 1, b_even_pos); } @@ -688,9 +810,9 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G7] + 1, g_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G7] + 1, g_odd_pos, &info->odd[2]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B4] + 1, b_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B4] + 1, b_odd_pos, &info->odd[2]); b_odd_pos += 2; } } @@ -715,16 +837,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R2] + 1, r_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R2] + 1, r_even_pos, &info->even[0]); r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G2] + 1, g_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G2] + 1, g_even_pos, &info->even[0]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R2] + 1, r_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R2] + 1, r_odd_pos, &info->odd[0]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G2] + 1, g_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G2] + 1, g_odd_pos, &info->odd[0]); g_odd_pos += 2; } } @@ -736,16 +858,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G3] + 1, g_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G3] + 1, g_even_pos, &info->even[1]); g_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B2] + 1, b_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B2] + 1, b_even_pos, &info->even[1]); b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G3] + 1, g_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G3] + 1, g_odd_pos, &info->odd[1]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B2] + 1, b_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B2] + 1, b_odd_pos, &info->odd[1]); b_odd_pos += 2; } } @@ -758,16 +880,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R3] + 1, r_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R3] + 1, r_even_pos, &info->even[2]); r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G4] + 1, g_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G4] + 1, g_even_pos, &info->even[2]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R3] + 1, r_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R3] + 1, r_odd_pos, &info->odd[2]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G4] + 1, g_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G4] + 1, g_odd_pos, &info->odd[2]); g_odd_pos += 2; } } @@ -780,16 +902,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G5] + 1, g_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G5] + 1, g_even_pos, &info->even[0]); g_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B3] + 1, b_even_pos, info->grad_even[0]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B3] + 1, b_even_pos, &info->even[0]); b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G5] + 1, g_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G5] + 1, g_odd_pos, &info->odd[0]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B3] + 1, b_odd_pos, info->grad_odd[0]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B3] + 1, b_odd_pos, &info->odd[0]); b_odd_pos += 2; } } @@ -802,16 +924,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R4] + 1, r_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R4] + 1, r_even_pos, &info->even[1]); r_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G6] + 1, g_even_pos, info->grad_even[1]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G6] + 1, g_even_pos, &info->even[1]); g_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R4] + 1, r_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R4] + 1, r_odd_pos, &info->odd[1]); r_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G6] + 1, g_odd_pos, info->grad_odd[1]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G6] + 1, g_odd_pos, &info->odd[1]); g_odd_pos += 2; } } @@ -824,16 +946,16 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st while (g_even_pos < line_width || g_odd_pos < line_width) { if (g_even_pos < line_width) { - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G7] + 1, g_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G7] + 1, g_even_pos, &info->even[2]); g_even_pos += 2; - errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B4] + 1, b_even_pos, info->grad_even[2]); + errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B4] + 1, b_even_pos, &info->even[2]); b_even_pos += 2; } if (g_even_pos > 8) { - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G7] + 1, g_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G7] + 1, g_odd_pos, &info->odd[2]); g_odd_pos += 2; - errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B4] + 1, b_odd_pos, info->grad_odd[2]); + errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B4] + 1, b_odd_pos, &info->odd[2]); b_odd_pos += 2; } } @@ -846,11 +968,21 @@ void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const st } } -void CLASS fuji_decode_strip (const struct fuji_compressed_params* info_common, int cur_block, INT64 raw_offset, unsigned dsize) +void CLASS fuji_decode_strip (fuji_compressed_params* params, int cur_block, INT64 raw_offset, unsigned dsize, uchar *q_bases) { int cur_block_width, cur_line; unsigned line_size; - struct fuji_compressed_block info; + fuji_compressed_block info; + fuji_compressed_params *info_common = params; + + if (!fuji_lossless) { + int buf_size = sizeof(fuji_compressed_params) + (2 << fuji_bits); + + info_common = (fuji_compressed_params *)malloc(buf_size); + memcpy(info_common, params, sizeof(fuji_compressed_params)); + info_common->qt[0].q_table = (int8_t *)(info_common + 1); + info_common->qt[0].q_base = -1; + } init_fuji_block (&info, info_common, raw_offset, dsize); line_size = sizeof (ushort) * (info_common->line_width + 2); @@ -869,6 +1001,17 @@ void CLASS fuji_decode_strip (const struct fuji_compressed_params* info_common, ztable[3] = {{_R2, 3}, {_G2, 6}, {_B2, 3}}; for (cur_line = 0; cur_line < fuji_total_lines; cur_line++) { + // init grads and main qtable + if (!fuji_lossless) + { + int q_base = q_bases ? q_bases[cur_line] : 0; + if (!cur_line || q_base != info_common->qt[0].q_base) + { + init_fuji_main_qtable(info_common, q_bases[cur_line]); + init_fuji_main_grads(info_common, &info); + } + } + if (fuji_raw_type == 16) { xtrans_decode_block (&info, info_common); } else { @@ -894,6 +1037,8 @@ void CLASS fuji_decode_strip (const struct fuji_compressed_params* info_common, } // release data + if (!fuji_lossless) + free (info_common); free (info.linealloc); #ifndef MYFILE_MMAP free (info.cur_buf); @@ -916,8 +1061,8 @@ void CLASS fuji_compressed_load_raw() struct fuji_compressed_params common_info; int cur_block; unsigned *block_sizes; + uchar *q_bases = 0; INT64 raw_offset, *raw_block_offsets; - //struct fuji_compressed_block info; init_fuji_compr (&common_info); @@ -927,17 +1072,30 @@ void CLASS fuji_compressed_load_raw() raw_block_offsets = (INT64*) malloc (sizeof (INT64) * fuji_total_blocks); merror (raw_block_offsets, "fuji_compressed_load_raw()"); - raw_offset = sizeof (unsigned) * fuji_total_blocks; + fseek(ifp, data_offset, SEEK_SET); + int sizesToRead = sizeof(unsigned) * fuji_total_blocks; + if (fread(block_sizes, 1, sizesToRead, ifp) != sizesToRead) + { + free(block_sizes); + free(raw_block_offsets); + derror(); + return; + } - if (raw_offset & 0xC) { - raw_offset += 0x10 - (raw_offset & 0xC); + raw_offset = ((sizeof(unsigned) * fuji_total_blocks) + 0xF) & ~0xF; + + // read q bases for lossy + if (!fuji_lossless) { + int total_q_bases = fuji_total_blocks * ((fuji_total_lines + 0xF) & ~0xF); + q_bases = (uchar *)malloc(total_q_bases); + merror (q_bases, "fuji_compressed_load_raw()"); + fseek(ifp, raw_offset + data_offset, SEEK_SET); + fread(q_bases, 1, total_q_bases, ifp); + raw_offset += total_q_bases; } raw_offset += data_offset; - fseek (ifp, data_offset, SEEK_SET); - fread (block_sizes, 1, sizeof (unsigned)*fuji_total_blocks, ifp); - raw_block_offsets[0] = raw_offset; // calculating raw block offsets @@ -950,33 +1108,34 @@ void CLASS fuji_compressed_load_raw() raw_block_offsets[cur_block] = raw_block_offsets[cur_block - 1] + block_sizes[cur_block - 1] ; } - fuji_decode_loop (&common_info, fuji_total_blocks, raw_block_offsets, block_sizes); + fuji_decode_loop (&common_info, fuji_total_blocks, raw_block_offsets, block_sizes, q_bases); - free (block_sizes); - free (raw_block_offsets); - free (common_info.q_table); + free(q_bases); + free(block_sizes); + free(raw_block_offsets); + free(common_info.buf); } -void CLASS fuji_decode_loop (const struct fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes) +void CLASS fuji_decode_loop (fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes, uchar *q_bases) { + const int lineStep = (fuji_total_lines + 0xF) & ~0xF; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,1) // dynamic scheduling is faster if count > number of cores (e.g. count for GFX 50S is 12) #endif for (int cur_block = 0; cur_block < count ; cur_block++) { - fuji_decode_strip (common_info, cur_block, raw_block_offsets[cur_block], block_sizes[cur_block]); + fuji_decode_strip(common_info, cur_block, raw_block_offsets[cur_block], block_sizes[cur_block], q_bases ? q_bases + cur_block * lineStep : 0); } } - void CLASS parse_fuji_compressed_header() { uchar header[16]; ushort signature; - uchar version; + uchar lossless; uchar h_raw_type; uchar h_raw_bits; ushort h_raw_height; @@ -987,10 +1146,10 @@ void CLASS parse_fuji_compressed_header() ushort h_total_lines; fseek (ifp, data_offset, SEEK_SET); - fread (header, 1, sizeof (header), ifp); + if (fread(header, 1, sizeof (header), ifp) != sizeof(header)) return; signature = sgetn (2, header); - version = header[2]; + lossless = header[2]; h_raw_type = header[3]; h_raw_bits = header[4]; h_raw_height = sgetn (2, header + 5); @@ -1000,32 +1159,29 @@ void CLASS parse_fuji_compressed_header() h_blocks_in_row = header[13]; h_total_lines = sgetn (2, header + 14); - // general validation if (signature != 0x4953 - || version != 1 - || h_raw_height > 0x3000 + || lossless > 1 + || h_raw_height > 0x4002 || h_raw_height < 6 || h_raw_height % 6 - || h_raw_width > 0x3000 + || h_raw_width > 0x4200 || h_raw_width < 0x300 || h_raw_width % 24 - || h_raw_rounded_width > 0x3000 - || h_block_size != 0x300 + || h_raw_rounded_width > 0x4200 || h_raw_rounded_width < h_block_size || h_raw_rounded_width % h_block_size || h_raw_rounded_width - h_raw_width >= h_block_size + || h_block_size != 0x300 || h_blocks_in_row > 0x10 || h_blocks_in_row == 0 || h_blocks_in_row != h_raw_rounded_width / h_block_size - || h_total_lines > 0x800 + || h_total_lines > 0xAAB || h_total_lines == 0 || h_total_lines != h_raw_height / 6 || (h_raw_bits != 12 && h_raw_bits != 14 && h_raw_bits != 16) - || (h_raw_type != 16 && h_raw_type != 0)) { - xtransCompressed = false; - return; - } + || (h_raw_type != 16 && h_raw_type != 0)) + return; // modify data fuji_total_lines = h_total_lines; @@ -1033,6 +1189,7 @@ void CLASS parse_fuji_compressed_header() fuji_block_width = h_block_size; fuji_bits = h_raw_bits; fuji_raw_type = h_raw_type; + fuji_lossless = lossless; raw_width = h_raw_width; raw_height = h_raw_height; data_offset += 16; From 4e57202bf6c909b12f5765869b208cdcb9616cb9 Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Sun, 31 Mar 2024 17:43:04 -0700 Subject: [PATCH 03/78] Improve Lensfun auto lens matching Handle lens names with spaces surrounding dashes. --- rtengine/rtlensfun.cc | 46 ++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index fc5bb0017..8bdda29ec 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -19,6 +19,7 @@ */ #include +#include #include "imagedata.h" #include "procparams.h" @@ -475,23 +476,36 @@ LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) c } } } - auto found = data_->FindLenses(camera.data_, nullptr, name.c_str()); - for (size_t pos = 0; !found && pos < name.size(); ) { - // try to split the maker from the model of the lens -- we have to - // guess a bit here, since there are makers with a multi-word name - // (e.g. "Leica Camera AG") - if (name.find("f/", pos) == 0) { - break; // no need to search further + const auto find_lens_from_name = [](const lfDatabase *database, const lfCamera *cam, const Glib::ustring &lens_name) { + auto found = database->FindLenses(cam, nullptr, lens_name.c_str()); + for (size_t pos = 0; !found && pos < lens_name.size(); ) { + // try to split the maker from the model of the lens -- we have to + // guess a bit here, since there are makers with a multi-word name + // (e.g. "Leica Camera AG") + if (lens_name.find("f/", pos) == 0) { + break; // no need to search further + } + Glib::ustring make, model; + auto i = lens_name.find(' ', pos); + if (i != Glib::ustring::npos) { + make = lens_name.substr(0, i); + model = lens_name.substr(i+1); + found = database->FindLenses(cam, make.c_str(), model.c_str()); + pos = i+1; + } else { + break; + } } - Glib::ustring make, model; - auto i = name.find(' ', pos); - if (i != Glib::ustring::npos) { - make = name.substr(0, i); - model = name.substr(i+1); - found = data_->FindLenses(camera.data_, make.c_str(), model.c_str()); - pos = i+1; - } else { - break; + return found; + }; + auto found = find_lens_from_name(data_, camera.data_, name); + if (!found) { + // Some names have white-space around the dash(s) while Lensfun does + // not have any. + const std::regex pattern("\\s*-\\s*"); + const auto formatted_name = std::regex_replace(name.raw(), pattern, "-"); + if (name != formatted_name) { + found = find_lens_from_name(data_, camera.data_, formatted_name); } } if (!found && camera && camera.isFixedLens()) { From dfc82c403c382e0ec95949edb91beb5946cf11b2 Mon Sep 17 00:00:00 2001 From: xiota Date: Tue, 21 Sep 2021 22:19:27 -0700 Subject: [PATCH 04/78] Add ability to import JXL images --- CMakeLists.txt | 5 ++ rtdata/options/options.lin | 4 +- rtdata/options/options.osx | 4 +- rtdata/options/options.win | 4 +- rtengine/CMakeLists.txt | 1 + rtengine/imageio.cc | 168 ++++++++++++++++++++++++++++++++++++- rtengine/imageio.h | 4 + rtengine/stdimagesource.cc | 6 ++ rtengine/utils.cc | 8 ++ rtengine/utils.h | 5 ++ rtgui/main-cli.cc | 2 +- rtgui/thumbnail.cc | 15 ++++ 12 files changed, 218 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 051d215e2..5ed90ca61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -552,6 +552,11 @@ if(WITH_SYSTEM_KLT) find_package(KLT REQUIRED) endif() +pkg_check_modules(JXL IMPORTED_TARGET libjxl libjxl_threads) +if(JXL) + set(JXL_LIBRARIES jxl jxl_threads) +endif() + # Check for libcanberra-gtk3 (sound events on Linux): if(UNIX AND (NOT APPLE)) option(USE_LIBCANBERRA "Build with libcanberra" ON) diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index fbd8bc6cb..0f31df6ee 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index ef68d7144..273b189e5 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -13,8 +13,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.win b/rtdata/options/options.win index 00b74d07f..9f72a1a72 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 6f329f7be..b92917ef5 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -246,6 +246,7 @@ target_link_libraries(rtengine ${RSVG_LIBRARIES} ${KLT_LIBRARIES} ${EXIV2_LIBRARIES} + ${JXL_LIBRARIES} ) if(OpenMP_FOUND) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index e2c6c1310..ece182821 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -24,13 +24,20 @@ #include #include #include - #include #include #include #include #include +#ifdef JXL +#include +#include "jxl/decode.h" +#include "jxl/decode_cxx.h" +#include "jxl/resizable_parallel_runner.h" +#include "jxl/resizable_parallel_runner_cxx.h" +#endif + #ifdef _WIN32 #include #else @@ -822,6 +829,161 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) return IMIO_SUCCESS; } +#ifdef JXL +#define _PROFILE_ JXL_COLOR_PROFILE_TARGET_ORIGINAL + +// adapted from libjxl +int ImageIO::loadJxl(const Glib::ustring &fname) +{ + if (pl) { + pl->setProgressStr("PROGRESSBAR_LOADJXL"); + pl->setProgress(0.0); + } + + std::vector icc_profile; + + gpointer buffer = nullptr; + size_t buffer_size = 0; + + JxlBasicInfo info = {}; + JxlPixelFormat format = {}; + + format.num_channels = 3; + format.data_type = JXL_TYPE_FLOAT; + format.endianness = JXL_NATIVE_ENDIAN; + format.align = 0; + + // get file contents + std::ifstream instream(fname.c_str(), std::ios::in | std::ios::binary); + std::vector compressed( + (std::istreambuf_iterator(instream)), + std::istreambuf_iterator()); + instream.close(); + + + // multi-threaded parallel runner. + auto runner = JxlResizableParallelRunnerMake(nullptr); + + auto dec = JxlDecoderMake(nullptr); + if (JXL_DEC_SUCCESS != + JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | + JXL_DEC_COLOR_ENCODING | + JXL_DEC_FULL_IMAGE)) { + g_printerr("Error: JxlDecoderSubscribeEvents failed\n"); + return false; + } + + if (JXL_DEC_SUCCESS != + JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, + runner.get())) { + g_printerr("Error: JxlDecoderSetParallelRunner failed\n"); + return false; + } + + // grand decode loop... + JxlDecoderSetInput(dec.get(), compressed.data(), compressed.size()); + + while (true) { + JxlDecoderStatus status = JxlDecoderProcessInput(dec.get()); + + if (status == JXL_DEC_BASIC_INFO) { + if (JXL_DEC_SUCCESS != + JxlDecoderGetBasicInfo(dec.get(), &info)) { + g_printerr("Error: JxlDecoderGetBasicInfo failed\n"); + return false; + } + + JxlResizableParallelRunnerSetThreads( + runner.get(), JxlResizableParallelRunnerSuggestThreads( + info.xsize, info.ysize)); + } else if (status == JXL_DEC_COLOR_ENCODING) { + // check for ICC profile + deleteLoadedProfileData(); + embProfile = nullptr; + size_t icc_size = 0; + + if (JXL_DEC_SUCCESS != + JxlDecoderGetICCProfileSize(dec.get(), &format, + _PROFILE_, &icc_size)) { + g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); + } + + if (icc_size > 0) { + icc_profile.resize(icc_size); + if (JXL_DEC_SUCCESS != + JxlDecoderGetColorAsICCProfile( + dec.get(), &format, _PROFILE_, + icc_profile.data(), icc_profile.size())) { + g_printerr( + "Warning: JxlDecoderGetColorAsICCProfile failed\n"); + } else { + embProfile = cmsOpenProfileFromMem(icc_profile.data(), + icc_profile.size()); + } + } else { + g_printerr("Warning: Empty ICC data.\n"); + } + } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { + format.data_type = JXL_TYPE_FLOAT; + if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize( + dec.get(), &format, &buffer_size)) { + g_printerr("Error: JxlDecoderImageOutBufferSize failed\n"); + return false; + } + buffer = g_malloc(buffer_size); + if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, + buffer, buffer_size)) { + g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); + g_free(buffer); + return false; + } + } else if (status == JXL_DEC_FULL_IMAGE || + status == JXL_DEC_FRAME) { + // Nothing to do. If the image is an animation, more full frames + // may be decoded. This example only keeps the first one. + } else if (status == JXL_DEC_SUCCESS) { + // All decoding successfully finished. + // It's not required to call JxlDecoderReleaseInput(dec.get()) + // since the decoder will be destroyed. + break; + } else if (status == JXL_DEC_NEED_MORE_INPUT) { + g_printerr("Error: Already provided all input\n"); + return false; + } else if (status == JXL_DEC_ERROR) { + g_printerr("Error: Decoder error\n"); + return false; + } else { + g_printerr("Error: Unknown decoder status\n"); + return false; + } + } // end grand decode loop + + unsigned int width = info.xsize; + unsigned int height = info.ysize; + + allocate(width, height); + + int line_length = width * 3 * 4; + + for (size_t row = 0; row < height; ++row) { + setScanline (row, ((const unsigned char*)buffer) + (row * line_length), 32); + + if (pl && !(row % 100)) { + pl->setProgress ((double)(row) / height); + } + } + + g_free(buffer); + + if (pl) { + pl->setProgressStr ("PROGRESSBAR_READY"); + pl->setProgress (1.0); + } + + return IMIO_SUCCESS; +} +#endif + int ImageIO::loadPPMFromMemory(const char* buffer, int width, int height, bool swap, int bps) { allocate (width, height); @@ -1310,6 +1472,10 @@ int ImageIO::load (const Glib::ustring &fname) return loadPNG (fname); } else if (hasJpegExtension(fname)) { return loadJPEG (fname); +#ifdef JXL + } else if (hasJxlExtension(fname)) { + return loadJxl(fname); +#endif } else if (hasTiffExtension(fname)) { return loadTIFF (fname); } else { diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 813bfcc61..e7fa23b20 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -90,6 +90,10 @@ public: int load (const Glib::ustring &fname); int save (const Glib::ustring &fname) const; +#ifdef JXL + int loadJxl (const Glib::ustring &fname); +#endif + int loadPNG (const Glib::ustring &fname); int loadJPEG (const Glib::ustring &fname); int loadTIFF (const Glib::ustring &fname); diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 435f2f9a0..33d02e5b1 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -90,6 +90,12 @@ void StdImageSource::getSampleFormat (const Glib::ustring &fname, IIOSampleForma if (result == IMIO_SUCCESS) { return; } +#ifdef JXL + } else if (hasJxlExtension(fname)) { + sFormat = IIOSF_FLOAT32; + sArrangement = IIOSA_CHUNKY; + return; +#endif } else if (hasTiffExtension(fname)) { int result = ImageIO::getTIFFSampleFormat (fname, sFormat, sArrangement); diff --git a/rtengine/utils.cc b/rtengine/utils.cc index 0674c9806..0a53f0a83 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -237,6 +237,14 @@ bool hasJpegExtension(const Glib::ustring& filename) return extension == "jpg" || extension == "jpeg"; } +#ifdef JXL +bool hasJxlExtension(const Glib::ustring& filename) +{ + const Glib::ustring extension = getFileExtension(filename); + return extension == "jxl"; +} +#endif + bool hasTiffExtension(const Glib::ustring& filename) { const Glib::ustring extension = getFileExtension(filename); diff --git a/rtengine/utils.h b/rtengine/utils.h index e0097d76e..06f42237c 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -52,6 +52,11 @@ bool hasTiffExtension(const Glib::ustring& filename); // Return true if file has .png extension (ignoring case) bool hasPngExtension(const Glib::ustring& filename); +#ifdef JXL +// Return true if file has .jxl extension (ignoring case) +bool hasJxlExtension(const Glib::ustring& filename); +#endif + void swab(const void* from, void* to, ssize_t n); } diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index 6d63d194a..6a3c34694 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -707,7 +707,7 @@ int processLineParams ( int argc, char **argv ) isRaw = true; Glib::ustring ext = getExtension (inputFile); - if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg" || ext.lowercase() == "tif" || ext.lowercase() == "tiff" || ext.lowercase() == "png") { + if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg" || ext.lowercase() == "tif" || ext.lowercase() == "tiff" || ext.lowercase() == "png" || ext.lowercase() == "jxl") { isRaw = false; } diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 266dbacd3..a0164bc7d 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -212,6 +212,12 @@ void Thumbnail::_generateThumbnailImage () if (tpp) { cfs.format = FT_Jpeg; } + } else if (ext == "jxl") { + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); + + if (tpp) { + cfs.format = FT_Png; + } } else if (ext == "png") { tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); @@ -255,6 +261,15 @@ void Thumbnail::_generateThumbnailImage () } } + if (!tpp) { + // try a custom loader + tpp = rtengine::Thumbnail::loadFromImage(fname, tw, th, -1, pparams->wb.equal, true); + if (tpp) { + cfs.format = FT_Custom; + infoFromImage(fname); + } + } + if (tpp) { tpp->getAutoWBMultipliers(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul); _saveThumbnail (); From dd01cc110bc438507a22bc86c4728319caebc11b Mon Sep 17 00:00:00 2001 From: xiota Date: Thu, 23 Sep 2021 13:34:48 -0700 Subject: [PATCH 05/78] Add error code to returns Fix conditional libjxl compilation --- CMakeLists.txt | 4 ++-- rtengine/CMakeLists.txt | 3 +++ rtengine/imageio.cc | 26 +++++++++++++------------- rtengine/imageio.h | 2 +- rtengine/stdimagesource.cc | 2 +- rtengine/utils.cc | 2 +- rtengine/utils.h | 2 +- rtgui/main-cli.cc | 2 +- rtgui/thumbnail.cc | 14 ++++++++------ 9 files changed, 31 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ed90ca61..23a3dbc0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -553,8 +553,8 @@ if(WITH_SYSTEM_KLT) endif() pkg_check_modules(JXL IMPORTED_TARGET libjxl libjxl_threads) -if(JXL) - set(JXL_LIBRARIES jxl jxl_threads) +if(JXL_FOUND) + add_definitions(-DLIBJXL) endif() # Check for libcanberra-gtk3 (sound events on Linux): diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index b92917ef5..5d87310b9 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -45,6 +45,9 @@ endif() if(EXIV2_INCLUDE_DIRS) include_directories("${EXIV2_INCLUDE_DIRS}") endif() +if(JXL_INCLUDE_DIRS) + include_directories("${JXL_INCLUDE_DIRS}") +endif() link_directories( "${EXPAT_LIBRARY_DIRS}" diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index ece182821..675e75f65 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -30,7 +30,7 @@ #include #include -#ifdef JXL +#ifdef LIBJXL #include #include "jxl/decode.h" #include "jxl/decode_cxx.h" @@ -829,9 +829,8 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) return IMIO_SUCCESS; } -#ifdef JXL +#ifdef LIBJXL #define _PROFILE_ JXL_COLOR_PROFILE_TARGET_ORIGINAL - // adapted from libjxl int ImageIO::loadJxl(const Glib::ustring &fname) { @@ -870,14 +869,14 @@ int ImageIO::loadJxl(const Glib::ustring &fname) JXL_DEC_COLOR_ENCODING | JXL_DEC_FULL_IMAGE)) { g_printerr("Error: JxlDecoderSubscribeEvents failed\n"); - return false; + return IMIO_HEADERERROR; } if (JXL_DEC_SUCCESS != JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, runner.get())) { g_printerr("Error: JxlDecoderSetParallelRunner failed\n"); - return false; + return IMIO_HEADERERROR; } // grand decode loop... @@ -890,7 +889,7 @@ int ImageIO::loadJxl(const Glib::ustring &fname) if (JXL_DEC_SUCCESS != JxlDecoderGetBasicInfo(dec.get(), &info)) { g_printerr("Error: JxlDecoderGetBasicInfo failed\n"); - return false; + return IMIO_HEADERERROR; } JxlResizableParallelRunnerSetThreads( @@ -928,14 +927,14 @@ int ImageIO::loadJxl(const Glib::ustring &fname) if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize( dec.get(), &format, &buffer_size)) { g_printerr("Error: JxlDecoderImageOutBufferSize failed\n"); - return false; + return IMIO_READERROR; } buffer = g_malloc(buffer_size); if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer, buffer_size)) { g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); g_free(buffer); - return false; + return IMIO_READERROR; } } else if (status == JXL_DEC_FULL_IMAGE || status == JXL_DEC_FRAME) { @@ -948,13 +947,13 @@ int ImageIO::loadJxl(const Glib::ustring &fname) break; } else if (status == JXL_DEC_NEED_MORE_INPUT) { g_printerr("Error: Already provided all input\n"); - return false; + return IMIO_READERROR; } else if (status == JXL_DEC_ERROR) { g_printerr("Error: Decoder error\n"); - return false; + return IMIO_READERROR; } else { g_printerr("Error: Unknown decoder status\n"); - return false; + return IMIO_READERROR; } } // end grand decode loop @@ -982,7 +981,8 @@ int ImageIO::loadJxl(const Glib::ustring &fname) return IMIO_SUCCESS; } -#endif +#undef _PROFILE_ +#endif // LIBJXL int ImageIO::loadPPMFromMemory(const char* buffer, int width, int height, bool swap, int bps) { @@ -1472,7 +1472,7 @@ int ImageIO::load (const Glib::ustring &fname) return loadPNG (fname); } else if (hasJpegExtension(fname)) { return loadJPEG (fname); -#ifdef JXL +#ifdef LIBJXL } else if (hasJxlExtension(fname)) { return loadJxl(fname); #endif diff --git a/rtengine/imageio.h b/rtengine/imageio.h index e7fa23b20..cfc54e629 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -90,7 +90,7 @@ public: int load (const Glib::ustring &fname); int save (const Glib::ustring &fname) const; -#ifdef JXL +#ifdef LIBJXL int loadJxl (const Glib::ustring &fname); #endif diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 33d02e5b1..32961f975 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -90,7 +90,7 @@ void StdImageSource::getSampleFormat (const Glib::ustring &fname, IIOSampleForma if (result == IMIO_SUCCESS) { return; } -#ifdef JXL +#ifdef LIBJXL } else if (hasJxlExtension(fname)) { sFormat = IIOSF_FLOAT32; sArrangement = IIOSA_CHUNKY; diff --git a/rtengine/utils.cc b/rtengine/utils.cc index 0a53f0a83..4c4f18691 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -237,7 +237,7 @@ bool hasJpegExtension(const Glib::ustring& filename) return extension == "jpg" || extension == "jpeg"; } -#ifdef JXL +#ifdef LIBJXL bool hasJxlExtension(const Glib::ustring& filename) { const Glib::ustring extension = getFileExtension(filename); diff --git a/rtengine/utils.h b/rtengine/utils.h index 06f42237c..7ff16c79b 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -52,7 +52,7 @@ bool hasTiffExtension(const Glib::ustring& filename); // Return true if file has .png extension (ignoring case) bool hasPngExtension(const Glib::ustring& filename); -#ifdef JXL +#ifdef LIBJXL // Return true if file has .jxl extension (ignoring case) bool hasJxlExtension(const Glib::ustring& filename); #endif diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index 6a3c34694..6d63d194a 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -707,7 +707,7 @@ int processLineParams ( int argc, char **argv ) isRaw = true; Glib::ustring ext = getExtension (inputFile); - if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg" || ext.lowercase() == "tif" || ext.lowercase() == "tiff" || ext.lowercase() == "png" || ext.lowercase() == "jxl") { + if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg" || ext.lowercase() == "tif" || ext.lowercase() == "tiff" || ext.lowercase() == "png") { isRaw = false; } diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index a0164bc7d..ba4c223ca 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -212,18 +212,20 @@ void Thumbnail::_generateThumbnailImage () if (tpp) { cfs.format = FT_Jpeg; } - } else if (ext == "jxl") { - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); - - if (tpp) { - cfs.format = FT_Png; - } } else if (ext == "png") { tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); if (tpp) { cfs.format = FT_Png; } +#ifdef LIBJXL + } else if (ext == "jxl") { + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); + + if (tpp) { + cfs.format = FT_Custom; + } +#endif } else if (ext == "tif" || ext == "tiff") { infoFromImage (fname); tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); From 320859bf922baa359203c34b921e65867a687fcf Mon Sep 17 00:00:00 2001 From: xiota Date: Thu, 23 Sep 2021 14:02:54 -0700 Subject: [PATCH 06/78] Remove unnecessary thumbnail loading code --- rtgui/thumbnail.cc | 83 +++++++++++++++------------------------------- 1 file changed, 26 insertions(+), 57 deletions(-) diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index ba4c223ca..18829d9e1 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -184,7 +184,6 @@ Glib::ustring Thumbnail::xmpSidecarPath(const Glib::ustring &imagePath) void Thumbnail::_generateThumbnailImage () { - // delete everything loaded into memory delete tpp; tpp = nullptr; @@ -205,67 +204,37 @@ void Thumbnail::_generateThumbnailImage () cfs.exifValid = false; cfs.timeValid = false; - if (ext == "jpg" || ext == "jpeg") { + // RAW works like this: + // 1. if we are here it's because we aren't in the cache so load the JPG + // image out of the RAW. Mark as "quick". + // 2. if we don't find that then just grab the real image. + bool quick = false; + + rtengine::eSensorType sensorType = rtengine::ST_NONE; + if ( initial_ && options.internalThumbIfUntouched) { + quick = true; + tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, sensorType, tw, th, 1, TRUE); + } + + if ( tpp == nullptr ) { + quick = false; + tpp = rtengine::Thumbnail::loadFromRaw (fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); + } + + cfs.sensortype = sensorType; + if (tpp) { + cfs.format = FT_Raw; + cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); - - if (tpp) { - cfs.format = FT_Jpeg; - } - } else if (ext == "png") { - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); - - if (tpp) { - cfs.format = FT_Png; - } -#ifdef LIBJXL - } else if (ext == "jxl") { - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); - - if (tpp) { - cfs.format = FT_Custom; - } -#endif - } else if (ext == "tif" || ext == "tiff") { - infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); - - if (tpp) { - cfs.format = FT_Tiff; - } - } else { - // RAW works like this: - // 1. if we are here it's because we aren't in the cache so load the JPG - // image out of the RAW. Mark as "quick". - // 2. if we don't find that then just grab the real image. - bool quick = false; - - rtengine::eSensorType sensorType = rtengine::ST_NONE; - if ( initial_ && options.internalThumbIfUntouched) { - quick = true; - tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, sensorType, tw, th, 1, TRUE); - } - - if ( tpp == nullptr ) { - quick = false; - tpp = rtengine::Thumbnail::loadFromRaw (fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); - } - - cfs.sensortype = sensorType; - if (tpp) { - cfs.format = FT_Raw; - cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; - infoFromImage (fname); - if (!quick) { - cfs.width = tpp->full_width; - cfs.height = tpp->full_height; - } + if (!quick) { + cfs.width = tpp->full_width; + cfs.height = tpp->full_height; } } if (!tpp) { - // try a custom loader - tpp = rtengine::Thumbnail::loadFromImage(fname, tw, th, -1, pparams->wb.equal, true); + // this will load formats supported by imagio (jpg, png, jxl, and tiff) + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); if (tpp) { cfs.format = FT_Custom; infoFromImage(fname); From 135bb7d2e9b38ec4fec3575053cdb99bb5b64cbd Mon Sep 17 00:00:00 2001 From: xiota Date: Sat, 23 Oct 2021 17:17:16 -0700 Subject: [PATCH 07/78] alphabetize extensions in rtdata/options/options.* --- rtdata/options/options.lin | 4 ++-- rtdata/options/options.osx | 4 ++-- rtdata/options/options.win | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index 0f31df6ee..c30ff61c7 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f +ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index 273b189e5..aec627ae8 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -13,8 +13,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f +ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.win b/rtdata/options/options.win index 9f72a1a72..a583b9046 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f +ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 [Output] PathTemplate=%p1/converted/%f From 8c4ab0277ab9d6091fcc436bff7dca820af5c2fe Mon Sep 17 00:00:00 2001 From: xiota Date: Sat, 23 Oct 2021 17:19:16 -0700 Subject: [PATCH 08/78] change , to ; in rtdata/options/options.* --- rtdata/options/options.lin | 4 ++-- rtdata/options/options.osx | 4 ++-- rtdata/options/options.win | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index c30ff61c7..2a96c6997 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f -ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;jxl;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index aec627ae8..eff9cd8d9 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -13,8 +13,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f -ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;jxl;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.win b/rtdata/options/options.win index a583b9046..e3f43343e 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f -ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;jxl;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f From 7715d156159abc10d7fbb43a75f63cacc31b12a4 Mon Sep 17 00:00:00 2001 From: xiota Date: Wed, 10 Apr 2024 12:32:49 +0000 Subject: [PATCH 09/78] Update to current libjxl API --- rtengine/imageio.cc | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 675e75f65..e5a3683dc 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -859,7 +859,6 @@ int ImageIO::loadJxl(const Glib::ustring &fname) std::istreambuf_iterator()); instream.close(); - // multi-threaded parallel runner. auto runner = JxlResizableParallelRunnerMake(nullptr); @@ -886,15 +885,14 @@ int ImageIO::loadJxl(const Glib::ustring &fname) JxlDecoderStatus status = JxlDecoderProcessInput(dec.get()); if (status == JXL_DEC_BASIC_INFO) { - if (JXL_DEC_SUCCESS != - JxlDecoderGetBasicInfo(dec.get(), &info)) { + if (JXL_DEC_SUCCESS != JxlDecoderGetBasicInfo(dec.get(), &info)) { g_printerr("Error: JxlDecoderGetBasicInfo failed\n"); return IMIO_HEADERERROR; } JxlResizableParallelRunnerSetThreads( - runner.get(), JxlResizableParallelRunnerSuggestThreads( - info.xsize, info.ysize)); + runner.get(), + JxlResizableParallelRunnerSuggestThreads(info.xsize, info.ysize)); } else if (status == JXL_DEC_COLOR_ENCODING) { // check for ICC profile deleteLoadedProfileData(); @@ -902,8 +900,7 @@ int ImageIO::loadJxl(const Glib::ustring &fname) size_t icc_size = 0; if (JXL_DEC_SUCCESS != - JxlDecoderGetICCProfileSize(dec.get(), &format, - _PROFILE_, &icc_size)) { + JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size)) { g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); } @@ -911,7 +908,7 @@ int ImageIO::loadJxl(const Glib::ustring &fname) icc_profile.resize(icc_size); if (JXL_DEC_SUCCESS != JxlDecoderGetColorAsICCProfile( - dec.get(), &format, _PROFILE_, + dec.get(), _PROFILE_, icc_profile.data(), icc_profile.size())) { g_printerr( "Warning: JxlDecoderGetColorAsICCProfile failed\n"); @@ -924,14 +921,15 @@ int ImageIO::loadJxl(const Glib::ustring &fname) } } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { format.data_type = JXL_TYPE_FLOAT; - if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize( - dec.get(), &format, &buffer_size)) { + + if (JXL_DEC_SUCCESS != + JxlDecoderImageOutBufferSize(dec.get(), &format, &buffer_size)) { g_printerr("Error: JxlDecoderImageOutBufferSize failed\n"); return IMIO_READERROR; } + buffer = g_malloc(buffer_size); - if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, - buffer, buffer_size)) { + if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer, buffer_size)) { g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); g_free(buffer); return IMIO_READERROR; From b2550abd83f598030a7dc3dc49f0e321658c9aa8 Mon Sep 17 00:00:00 2001 From: xiota Date: Wed, 10 Apr 2024 13:44:09 +0000 Subject: [PATCH 10/78] Add cmake option WITH_JXL ON = Force required OFF = Optional --- CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23a3dbc0c..f26112cd2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -222,6 +222,7 @@ option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) option(BUILD_SHARED "Build with shared libraries" OFF) option(WITH_BENCHMARK "Build with benchmark code" OFF) option(WITH_MYFILE_MMAP "Build using memory mapped file" ON) +option(WITH_JXL "Build with JPEG XL import support" OFF) option(WITH_LTO "Build with link-time optimizations" OFF) option(WITH_SAN "Build with run-time sanitizer" OFF) option(WITH_PROF "Build with profiling instrumentation" OFF) @@ -552,7 +553,12 @@ if(WITH_SYSTEM_KLT) find_package(KLT REQUIRED) endif() -pkg_check_modules(JXL IMPORTED_TARGET libjxl libjxl_threads) +set(JXL_LIBS "libjxl libjxl_threads") +if(WITH_JXL) + pkg_check_modules(JXL REQUIRED IMPORTED_TARGET ${JXL_LIBS}) +else() + pkg_check_modules(JXL IMPORTED_TARGET ${JXL_LIBS}) +endif() if(JXL_FOUND) add_definitions(-DLIBJXL) endif() From 4a16bdd624ffbce579359a9acc425c6efec4949d Mon Sep 17 00:00:00 2001 From: xiota Date: Wed, 10 Apr 2024 18:18:55 +0000 Subject: [PATCH 11/78] Change WITH_JXL option to tristate (AUTO/ON/OFF) --- CMakeLists.txt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f26112cd2..4fd1221c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -222,7 +222,6 @@ option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) option(BUILD_SHARED "Build with shared libraries" OFF) option(WITH_BENCHMARK "Build with benchmark code" OFF) option(WITH_MYFILE_MMAP "Build using memory mapped file" ON) -option(WITH_JXL "Build with JPEG XL import support" OFF) option(WITH_LTO "Build with link-time optimizations" OFF) option(WITH_SAN "Build with run-time sanitizer" OFF) option(WITH_PROF "Build with profiling instrumentation" OFF) @@ -248,6 +247,9 @@ set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library") +set(WITH_JXL AUTO CACHE STRING "Build with JPEG XL support") +set_property(CACHE WITH_JXL PROPERTY STRINGS AUTO ON OFF) + # Set installation directories: if(WIN32 OR APPLE) if(BUILD_BUNDLE) @@ -560,7 +562,13 @@ else() pkg_check_modules(JXL IMPORTED_TARGET ${JXL_LIBS}) endif() if(JXL_FOUND) - add_definitions(-DLIBJXL) + if(WITH_JXL OR WITH_JXL STREQUAL AUTO) + add_definitions(-DLIBJXL) + else() + message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") + set(JXL_INCLUDE_DIRS "") + set(JXL_LIBRARIES "") + endif() endif() # Check for libcanberra-gtk3 (sound events on Linux): From c514fbb939662aa0df0e5015f9a7560f1c97aeee Mon Sep 17 00:00:00 2001 From: xiota Date: Wed, 10 Apr 2024 18:51:06 +0000 Subject: [PATCH 12/78] Fix tristate auto behavior --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fd1221c0..141783f23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,7 +247,7 @@ set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library") -set(WITH_JXL AUTO CACHE STRING "Build with JPEG XL support") +set(WITH_JXL "AUTO" CACHE STRING "Build with JPEG XL support") set_property(CACHE WITH_JXL PROPERTY STRINGS AUTO ON OFF) # Set installation directories: @@ -556,13 +556,13 @@ if(WITH_SYSTEM_KLT) endif() set(JXL_LIBS "libjxl libjxl_threads") -if(WITH_JXL) +if(WITH_JXL AND NOT WITH_JXL STREQUAL "AUTO") pkg_check_modules(JXL REQUIRED IMPORTED_TARGET ${JXL_LIBS}) else() pkg_check_modules(JXL IMPORTED_TARGET ${JXL_LIBS}) endif() if(JXL_FOUND) - if(WITH_JXL OR WITH_JXL STREQUAL AUTO) + if(WITH_JXL OR WITH_JXL STREQUAL "AUTO") add_definitions(-DLIBJXL) else() message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") From 01f925d8d7f295be0efcdb6f744a1e57a0fdb4d9 Mon Sep 17 00:00:00 2001 From: xiota Date: Thu, 11 Apr 2024 05:31:03 +0000 Subject: [PATCH 13/78] Revise cmake tristate option --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 141783f23..fe7884ee9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -555,12 +555,12 @@ if(WITH_SYSTEM_KLT) find_package(KLT REQUIRED) endif() -set(JXL_LIBS "libjxl libjxl_threads") if(WITH_JXL AND NOT WITH_JXL STREQUAL "AUTO") - pkg_check_modules(JXL REQUIRED IMPORTED_TARGET ${JXL_LIBS}) + set(JXL_REQUIRED "REQUIRED") else() - pkg_check_modules(JXL IMPORTED_TARGET ${JXL_LIBS}) + set(JXL_REQUIRED "") endif() +pkg_check_modules(JXL ${JXL_REQUIRED} IMPORTED_TARGET libjxl libjxl_threads) if(JXL_FOUND) if(WITH_JXL OR WITH_JXL STREQUAL "AUTO") add_definitions(-DLIBJXL) From fe68e913be19fe5b8ae8af9bf8c0defaf4fdba4e Mon Sep 17 00:00:00 2001 From: xiota Date: Thu, 11 Apr 2024 15:44:55 +0000 Subject: [PATCH 14/78] Conditional compilation for old/new API Debian/Ubuntu package libjxl 0.7.0, but Arch/MSYS2 package 0.10.2 --- rtengine/imageio.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index e5a3683dc..c6576b3c8 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -900,16 +900,28 @@ int ImageIO::loadJxl(const Glib::ustring &fname) size_t icc_size = 0; if (JXL_DEC_SUCCESS != - JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size)) { +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) + JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) +#else + JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) +#endif + ) { g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); } if (icc_size > 0) { icc_profile.resize(icc_size); if (JXL_DEC_SUCCESS != +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) + JxlDecoderGetColorAsICCProfile( + dec.get(), &format, _PROFILE_, + icc_profile.data(), icc_profile.size()) +#else JxlDecoderGetColorAsICCProfile( dec.get(), _PROFILE_, - icc_profile.data(), icc_profile.size())) { + icc_profile.data(), icc_profile.size()) +#endif + ) { g_printerr( "Warning: JxlDecoderGetColorAsICCProfile failed\n"); } else { From 79450113b4cff12af787e209b1fbbd9b57d3a6ec Mon Sep 17 00:00:00 2001 From: xiota Date: Fri, 12 Apr 2024 22:02:37 +0000 Subject: [PATCH 15/78] Add libjxl to workflow depends lists --- .github/workflows/appimage.yml | 2 +- .github/workflows/codeql.yml | 2 +- .github/workflows/macos.yml | 2 +- .github/workflows/windows.yml | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index cf82dafb8..b44ce89c6 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -35,7 +35,7 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libjxl-dev libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full - name: Install Exiv2 run: | diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f57786098..868bccf42 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,7 +41,7 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libjxl-dev - name: Configure build run: | diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 8755f7c66..ad16f96d5 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -25,7 +25,7 @@ jobs: mkdir build date +%s > build/stamp brew uninstall --ignore-dependencies libtiff - brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig llvm shared-mime-info exiv2 | tee -a depslog + brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig llvm shared-mime-info exiv2 jpeg-xl | tee -a depslog date -u echo "----====Pourage====----" cat depslog | grep Pouring diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 6963df7c9..56a6320e6 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -52,6 +52,7 @@ jobs: fftw:p lensfun:p libiptcdata:p + libjxl:p exiv2:p - name: Configure build From 9cd5ebbf3795711fd52fc0eb321b413ec5099a9f Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 02:08:02 +0000 Subject: [PATCH 16/78] Add libjxl to appimage workflow --- .github/workflows/appimage.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index b44ce89c6..cc0f6b025 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -35,7 +35,21 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libjxl-dev libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full libtcmalloc-minimal4 + + - name: Install libjxl + run: | + echo "Downloading and installing libhwy and libjxl..." + VERSION_UBUNTU=20.04 + VERSION_JXL=0.10.2 + DEB_URL_HWYDEV="https://launchpad.net/~ubuntuhandbook1/+archive/ubuntu/apps/+files/libhwy-dev_0.16.0-0focal1_amd64.deb" + DEB_URL_HWY="https://launchpad.net/~ubuntuhandbook1/+archive/ubuntu/apps/+files/libhwy0_0.16.0-0focal1_amd64.deb" + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libhwy-dev.deb "$DEB_URL_HWYDEV" + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libhwy.deb "$DEB_URL_HWY" + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libjxl-debs.tar.gz \ + "https://github.com/libjxl/libjxl/releases/download/v${VERSION_JXL}/jxl-debs-amd64-ubuntu-${VERSION_UBUNTU}-v${VERSION_JXL}.tar.gz" + tar xf libjxl-debs.tar.gz + DEBIAN_FRONTEND=noninteractive sudo dpkg -i libhwy-dev.deb libhwy.deb jxl_${VERSION_JXL}_amd64.deb libjxl-dev_${VERSION_JXL}_amd64.deb libjxl_${VERSION_JXL}_amd64.deb - name: Install Exiv2 run: | From aff8de59ea1efcadb7bbcdaad120e4215508a2f0 Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 02:10:17 +0000 Subject: [PATCH 17/78] Add libjxl to codeql workflow --- .github/workflows/codeql.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 868bccf42..9452c0587 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,7 +41,17 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libjxl-dev + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libhwy0 libhwy-dev + + - name: Install libjxl + run: | + echo "Downloading and installing libjxl..." + VERSION_UBUNTU=22.04 + VERSION_JXL=0.10.2 + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libjxl-debs.tar.gz \ + "https://github.com/libjxl/libjxl/releases/download/v${VERSION_JXL}/jxl-debs-amd64-ubuntu-${VERSION_UBUNTU}-v${VERSION_JXL}.tar.gz" + tar xf libjxl-debs.tar.gz + DEBIAN_FRONTEND=noninteractive sudo dpkg -i jxl_${VERSION_JXL}_amd64.deb libjxl-dev_${VERSION_JXL}_amd64.deb libjxl_${VERSION_JXL}_amd64.deb - name: Configure build run: | From 775f7cbd036c394dcce2aff926460739d6d4245c Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 05:22:24 +0000 Subject: [PATCH 18/78] Add missing dep to codeql workflow --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 9452c0587..049b1d184 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,7 +41,7 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libhwy0 libhwy-dev + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libtcmalloc-minimal4 libhwy0 libhwy-dev - name: Install libjxl run: | From bde73f5ce1206e0a1b822c4eaea3cdab64a8dde2 Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 06:14:20 +0000 Subject: [PATCH 19/78] Use makedeb to build libjxl from source --- .github/workflows/appimage.yml | 23 +++--- tools/makedeb/PKGBUILD.libjxl | 41 ++++++++++ tools/makedeb/install.sh | 135 +++++++++++++++++++++++++++++++++ 3 files changed, 187 insertions(+), 12 deletions(-) create mode 100644 tools/makedeb/PKGBUILD.libjxl create mode 100644 tools/makedeb/install.sh diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index cc0f6b025..cecd43ad3 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -35,21 +35,20 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full libtcmalloc-minimal4 + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full gettext libarchive-tools zstd libgif-dev libwebp-dev libwebpdemux2 + + - name: Install makedeb + run: | + echo "Installing makedeb..." + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o makedeb.deb \ + "https://github.com/makedeb/makedeb/releases/download/v16.1.0-beta1/makedeb-beta_16.1.0-beta1_amd64_focal.deb" + DEBIAN_FRONTEND=noninteractive sudo dpkg -i makedeb.deb - name: Install libjxl + working-directory: tools/makedeb run: | - echo "Downloading and installing libhwy and libjxl..." - VERSION_UBUNTU=20.04 - VERSION_JXL=0.10.2 - DEB_URL_HWYDEV="https://launchpad.net/~ubuntuhandbook1/+archive/ubuntu/apps/+files/libhwy-dev_0.16.0-0focal1_amd64.deb" - DEB_URL_HWY="https://launchpad.net/~ubuntuhandbook1/+archive/ubuntu/apps/+files/libhwy0_0.16.0-0focal1_amd64.deb" - curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libhwy-dev.deb "$DEB_URL_HWYDEV" - curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libhwy.deb "$DEB_URL_HWY" - curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libjxl-debs.tar.gz \ - "https://github.com/libjxl/libjxl/releases/download/v${VERSION_JXL}/jxl-debs-amd64-ubuntu-${VERSION_UBUNTU}-v${VERSION_JXL}.tar.gz" - tar xf libjxl-debs.tar.gz - DEBIAN_FRONTEND=noninteractive sudo dpkg -i libhwy-dev.deb libhwy.deb jxl_${VERSION_JXL}_amd64.deb libjxl-dev_${VERSION_JXL}_amd64.deb libjxl_${VERSION_JXL}_amd64.deb + echo "Building and installing libjxl..." + makedeb -si --no-confirm -p PKGBUILD.libjxl - name: Install Exiv2 run: | diff --git a/tools/makedeb/PKGBUILD.libjxl b/tools/makedeb/PKGBUILD.libjxl new file mode 100644 index 000000000..b63801812 --- /dev/null +++ b/tools/makedeb/PKGBUILD.libjxl @@ -0,0 +1,41 @@ +# Maintainer: RawTherapee Developers + +_pkgname="libjxl" +pkgname="$_pkgname" +pkgver='0.10.2' +pkgrel='1' +pkgdesc='JPEG XL image format reference implementation' +url='https://github.com/libjxl/libjxl' +license=('BSD') +arch=('amd64') + +depends=('libgif-dev' 'libjpeg-dev' 'libopenexr-dev' 'libpng-dev' 'libwebp-dev') +makedepends=('cmake' 'pkg-config' 'libbrotli-dev' 'libgflags-dev') + +_pkgsrc="$_pkgname" +source=("git+$url.git#tag=v$pkgver") +sha256sums=('SKIP') + +prepare() { + cd "$_pkgsrc" + git submodule update --init --recursive --depth 1 --recommend-shallow +} + +build() { + local _cmake_options=( + -B build + -S "$_pkgsrc" + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_INSTALL_PREFIX='/usr' + -DJPEGXL_FORCE_SYSTEM_BROTLI=ON + -DBUILD_TESTING=OFF + -Wno-dev + ) + + cmake "${_cmake_options[@]}" + cmake --build build --parallel +} + +package() { + DESTDIR="$pkgdir" cmake --install build +} diff --git a/tools/makedeb/install.sh b/tools/makedeb/install.sh new file mode 100644 index 000000000..409c0f5a1 --- /dev/null +++ b/tools/makedeb/install.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash +# The installation script for makedeb. This is the script that's shown and gets ran from https://makedeb.org. +set -e + +# Handy env vars. +MAKEDEB_RELEASE="${MAKEDEB_RELEASE:-}" +makedeb_url='makedeb.org' +color_normal="$(tput sgr0)" +color_bold="$(tput bold)" +color_green="$(tput setaf 77)" +color_orange="$(tput setaf 214)" +color_blue="$(tput setaf 14)" +color_red="$(tput setaf 202)" +color_purple="$(tput setaf 135)" +noninteractive_mode=0 +apt_args=() + +# Handy functions. +msg() { + echo "${color_blue}[>]${color_normal} ${1}" +} + +error() { + echo "${color_red}[!]${color_normal} ${1}" +} + +question() { + echo "${color_purple}[?]${color_normal} ${1}" +} + +die_cmd() { + error "${1}" + exit 1 +} + +answered_yes() { + if [[ "${1}" == "" || "${1,,}" == "y" ]]; then + return 0 + else + return 1 + fi +} + +# Pre-checks. +if [[ "${UID}" == "0" ]]; then + die_cmd "This script is not allowed to be run under the root user. Please run as a normal user and try again." +fi + +# Program start. +echo "-------------------------" +echo "${color_green}[#]${color_normal} ${color_orange}makedeb Installer${color_normal} ${color_green}[#]${color_normal}" +echo "-------------------------" +echo + +if ! echo "${-}" | grep -q i; then + msg "Running in noninteractive mode." + noninteractive_mode=1 + export DEBIAN_FRONTEND=noninteractive + apt_args+=('-y') +fi + +msg "Ensuring needed packages are installed..." +if ! sudo apt-get update "${apt_args[@]}"; then + die_cmd "Failed to update APT cache." +fi + +missing_dependencies=() +dpkg-query -W 'wget' > /dev/null 2>&1 || missing_dependencies+=('wget') +dpkg-query -W 'gpg' > /dev/null 2>&1 || missing_dependencies+=('gpg') + +if ! ( test -z "${missing_dependencies[*]}" || sudo apt-get install "${apt_args[@]}" --mark-auto "${missing_dependencies[@]}" ); then + die_cmd "Failed to install needed packages." +fi + +echo + +if (( "${noninteractive_mode}" )) && [[ "${MAKEDEB_RELEASE:+x}" == '' ]]; then + error "The script was ran in noninteractive mode, but no makedeb package was specified to install." + error "Please specify a package to install via the 'MAKEDEB_RELEASE' environment variable." + die_cmd "Available packages are 'makedeb', 'makedeb-beta', and 'makedeb-alpha'." +elif [[ "${MAKEDEB_RELEASE:+x}" == '' ]]; then + msg "Multiple releases of makedeb are available for installation." + msg "Currently, you can install one of 'makedeb', 'makedeb-beta', or" + msg "'makedeb-alpha'." + + while true; do + read -p "$(question "Which release would you like? ")" MAKEDEB_RELEASE + + if ! echo "${MAKEDEB_RELEASE}" | grep -qE '^makedeb$|^makedeb-beta$|^makedeb-alpha$'; then + error "Invalid response: ${MAKEDEB_RELEASE}" + continue + fi + + break + done + + echo +fi + +case "${MAKEDEB_RELEASE}" in + makedeb|makedeb-alpha|makedeb-beta) + ;; + *) + echo + error "Invalid \$MAKEDEB_RELEASE: '${MAKEDEB_RELEASE}'" + exit 1 ;; +esac + +msg "Setting up makedeb APT repository..." +if ! wget -qO - "https://proget.${makedeb_url}/debian-feeds/makedeb.pub" | gpg --dearmor | sudo tee /usr/share/keyrings/makedeb-archive-keyring.gpg 1> /dev/null; then + die_cmd "Failed to set up makedeb APT repository." +fi +echo "deb [signed-by=/usr/share/keyrings/makedeb-archive-keyring.gpg arch=all] https://proget.${makedeb_url} makedeb main" | sudo tee /etc/apt/sources.list.d/makedeb.list 1> /dev/null + +msg "Updating APT cache..." +if ! sudo apt-get update "${apt_args[@]}"; then + die_cmd "Failed to update APT cache." +fi + +echo +msg "Installing '${MAKEDEB_RELEASE}'..." +if ! sudo apt-get install "${apt_args[@]}" -- "${MAKEDEB_RELEASE}"; then + die_cmd "Failed to install package." +fi + +msg "Finished! If you need help of any kind, feel free to reach out:" +echo +msg "${color_bold}makedeb Homepage:${color_normal} https://${makedeb_url}" +msg "${color_bold}makedeb Package Repository:${color_normal} https://mpr.${makedeb_url}" +msg "${color_bold}makedeb Documentation:${color_normal} https://docs.${makedeb_url}" +msg "${color_bold}makedeb Support:${color_normal} https://docs.${makedeb_url}/support/obtaining-support" +echo +msg "Enjoy makedeb!" + +# vim: set sw=4 expandtab: From 1ad5ec3e9ef779d52614e38f6ea4252817109e1d Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 08:02:20 +0000 Subject: [PATCH 20/78] Remove makedeb installer script --- tools/makedeb/install.sh | 135 --------------------------------------- 1 file changed, 135 deletions(-) delete mode 100644 tools/makedeb/install.sh diff --git a/tools/makedeb/install.sh b/tools/makedeb/install.sh deleted file mode 100644 index 409c0f5a1..000000000 --- a/tools/makedeb/install.sh +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env bash -# The installation script for makedeb. This is the script that's shown and gets ran from https://makedeb.org. -set -e - -# Handy env vars. -MAKEDEB_RELEASE="${MAKEDEB_RELEASE:-}" -makedeb_url='makedeb.org' -color_normal="$(tput sgr0)" -color_bold="$(tput bold)" -color_green="$(tput setaf 77)" -color_orange="$(tput setaf 214)" -color_blue="$(tput setaf 14)" -color_red="$(tput setaf 202)" -color_purple="$(tput setaf 135)" -noninteractive_mode=0 -apt_args=() - -# Handy functions. -msg() { - echo "${color_blue}[>]${color_normal} ${1}" -} - -error() { - echo "${color_red}[!]${color_normal} ${1}" -} - -question() { - echo "${color_purple}[?]${color_normal} ${1}" -} - -die_cmd() { - error "${1}" - exit 1 -} - -answered_yes() { - if [[ "${1}" == "" || "${1,,}" == "y" ]]; then - return 0 - else - return 1 - fi -} - -# Pre-checks. -if [[ "${UID}" == "0" ]]; then - die_cmd "This script is not allowed to be run under the root user. Please run as a normal user and try again." -fi - -# Program start. -echo "-------------------------" -echo "${color_green}[#]${color_normal} ${color_orange}makedeb Installer${color_normal} ${color_green}[#]${color_normal}" -echo "-------------------------" -echo - -if ! echo "${-}" | grep -q i; then - msg "Running in noninteractive mode." - noninteractive_mode=1 - export DEBIAN_FRONTEND=noninteractive - apt_args+=('-y') -fi - -msg "Ensuring needed packages are installed..." -if ! sudo apt-get update "${apt_args[@]}"; then - die_cmd "Failed to update APT cache." -fi - -missing_dependencies=() -dpkg-query -W 'wget' > /dev/null 2>&1 || missing_dependencies+=('wget') -dpkg-query -W 'gpg' > /dev/null 2>&1 || missing_dependencies+=('gpg') - -if ! ( test -z "${missing_dependencies[*]}" || sudo apt-get install "${apt_args[@]}" --mark-auto "${missing_dependencies[@]}" ); then - die_cmd "Failed to install needed packages." -fi - -echo - -if (( "${noninteractive_mode}" )) && [[ "${MAKEDEB_RELEASE:+x}" == '' ]]; then - error "The script was ran in noninteractive mode, but no makedeb package was specified to install." - error "Please specify a package to install via the 'MAKEDEB_RELEASE' environment variable." - die_cmd "Available packages are 'makedeb', 'makedeb-beta', and 'makedeb-alpha'." -elif [[ "${MAKEDEB_RELEASE:+x}" == '' ]]; then - msg "Multiple releases of makedeb are available for installation." - msg "Currently, you can install one of 'makedeb', 'makedeb-beta', or" - msg "'makedeb-alpha'." - - while true; do - read -p "$(question "Which release would you like? ")" MAKEDEB_RELEASE - - if ! echo "${MAKEDEB_RELEASE}" | grep -qE '^makedeb$|^makedeb-beta$|^makedeb-alpha$'; then - error "Invalid response: ${MAKEDEB_RELEASE}" - continue - fi - - break - done - - echo -fi - -case "${MAKEDEB_RELEASE}" in - makedeb|makedeb-alpha|makedeb-beta) - ;; - *) - echo - error "Invalid \$MAKEDEB_RELEASE: '${MAKEDEB_RELEASE}'" - exit 1 ;; -esac - -msg "Setting up makedeb APT repository..." -if ! wget -qO - "https://proget.${makedeb_url}/debian-feeds/makedeb.pub" | gpg --dearmor | sudo tee /usr/share/keyrings/makedeb-archive-keyring.gpg 1> /dev/null; then - die_cmd "Failed to set up makedeb APT repository." -fi -echo "deb [signed-by=/usr/share/keyrings/makedeb-archive-keyring.gpg arch=all] https://proget.${makedeb_url} makedeb main" | sudo tee /etc/apt/sources.list.d/makedeb.list 1> /dev/null - -msg "Updating APT cache..." -if ! sudo apt-get update "${apt_args[@]}"; then - die_cmd "Failed to update APT cache." -fi - -echo -msg "Installing '${MAKEDEB_RELEASE}'..." -if ! sudo apt-get install "${apt_args[@]}" -- "${MAKEDEB_RELEASE}"; then - die_cmd "Failed to install package." -fi - -msg "Finished! If you need help of any kind, feel free to reach out:" -echo -msg "${color_bold}makedeb Homepage:${color_normal} https://${makedeb_url}" -msg "${color_bold}makedeb Package Repository:${color_normal} https://mpr.${makedeb_url}" -msg "${color_bold}makedeb Documentation:${color_normal} https://docs.${makedeb_url}" -msg "${color_bold}makedeb Support:${color_normal} https://docs.${makedeb_url}/support/obtaining-support" -echo -msg "Enjoy makedeb!" - -# vim: set sw=4 expandtab: From 4d715cf281c53eb49e1cb3d41afff776f9632d34 Mon Sep 17 00:00:00 2001 From: xiota Date: Tue, 16 Apr 2024 15:49:40 +0000 Subject: [PATCH 21/78] Make requested changes --- rtengine/imageio.cc | 91 +++++++++++++++++++++------------------------ rtengine/imageio.h | 2 +- rtengine/utils.cc | 3 +- rtgui/thumbnail.cc | 34 +++++++++-------- 4 files changed, 64 insertions(+), 66 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index c6576b3c8..5f5573265 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -24,6 +24,7 @@ #include #include #include + #include #include #include @@ -31,10 +32,7 @@ #include #ifdef LIBJXL -#include -#include "jxl/decode.h" #include "jxl/decode_cxx.h" -#include "jxl/resizable_parallel_runner.h" #include "jxl/resizable_parallel_runner_cxx.h" #endif @@ -832,17 +830,16 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) #ifdef LIBJXL #define _PROFILE_ JXL_COLOR_PROFILE_TARGET_ORIGINAL // adapted from libjxl -int ImageIO::loadJxl(const Glib::ustring &fname) +int ImageIO::loadJXL(const Glib::ustring &fname) { if (pl) { pl->setProgressStr("PROGRESSBAR_LOADJXL"); pl->setProgress(0.0); } - std::vector icc_profile; - - gpointer buffer = nullptr; - size_t buffer_size = 0; + std::vector icc_profile; + std::vector buffer; + std::size_t buffer_size = 0; JxlBasicInfo info = {}; JxlPixelFormat format = {}; @@ -852,28 +849,25 @@ int ImageIO::loadJxl(const Glib::ustring &fname) format.endianness = JXL_NATIVE_ENDIAN; format.align = 0; - // get file contents - std::ifstream instream(fname.c_str(), std::ios::in | std::ios::binary); - std::vector compressed( - (std::istreambuf_iterator(instream)), - std::istreambuf_iterator()); - instream.close(); + std::string const contents = Glib::file_get_contents(fname); + std::vector const compressed(contents.begin(), contents.end()); // multi-threaded parallel runner. auto runner = JxlResizableParallelRunnerMake(nullptr); auto dec = JxlDecoderMake(nullptr); + if (JXL_DEC_SUCCESS != - JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | - JXL_DEC_COLOR_ENCODING | - JXL_DEC_FULL_IMAGE)) { + JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | + JXL_DEC_COLOR_ENCODING | + JXL_DEC_FULL_IMAGE)) { g_printerr("Error: JxlDecoderSubscribeEvents failed\n"); return IMIO_HEADERERROR; } if (JXL_DEC_SUCCESS != - JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, - runner.get())) { + JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, + runner.get())) { g_printerr("Error: JxlDecoderSetParallelRunner failed\n"); return IMIO_HEADERERROR; } @@ -897,31 +891,32 @@ int ImageIO::loadJxl(const Glib::ustring &fname) // check for ICC profile deleteLoadedProfileData(); embProfile = nullptr; - size_t icc_size = 0; + std::size_t icc_size = 0; if (JXL_DEC_SUCCESS != #if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) - JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) + JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) #else - JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) + JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) #endif - ) { + ) { g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); } if (icc_size > 0) { icc_profile.resize(icc_size); + if (JXL_DEC_SUCCESS != #if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) - JxlDecoderGetColorAsICCProfile( - dec.get(), &format, _PROFILE_, - icc_profile.data(), icc_profile.size()) + JxlDecoderGetColorAsICCProfile( + dec.get(), &format, _PROFILE_, + icc_profile.data(), icc_profile.size()) #else - JxlDecoderGetColorAsICCProfile( - dec.get(), _PROFILE_, - icc_profile.data(), icc_profile.size()) + JxlDecoderGetColorAsICCProfile( + dec.get(), _PROFILE_, + icc_profile.data(), icc_profile.size()) #endif - ) { + ) { g_printerr( "Warning: JxlDecoderGetColorAsICCProfile failed\n"); } else { @@ -932,7 +927,10 @@ int ImageIO::loadJxl(const Glib::ustring &fname) g_printerr("Warning: Empty ICC data.\n"); } } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { - format.data_type = JXL_TYPE_FLOAT; + // Note: If this assert is ever triggered, it should be changed + // to an assignment. We want the maximum bit depth the decoder + // can provide regardless of the original encoding intent. + assert(format.data_type == JXL_TYPE_FLOAT); if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize(dec.get(), &format, &buffer_size)) { @@ -940,20 +938,19 @@ int ImageIO::loadJxl(const Glib::ustring &fname) return IMIO_READERROR; } - buffer = g_malloc(buffer_size); - if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer, buffer_size)) { + buffer.resize(buffer_size); + + if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer.data(), buffer.size())) { g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); - g_free(buffer); return IMIO_READERROR; } } else if (status == JXL_DEC_FULL_IMAGE || status == JXL_DEC_FRAME) { // Nothing to do. If the image is an animation, more full frames // may be decoded. This example only keeps the first one. + break; } else if (status == JXL_DEC_SUCCESS) { - // All decoding successfully finished. - // It's not required to call JxlDecoderReleaseInput(dec.get()) - // since the decoder will be destroyed. + // Decoding complete. Decoder will be released automatically. break; } else if (status == JXL_DEC_NEED_MORE_INPUT) { g_printerr("Error: Already provided all input\n"); @@ -967,26 +964,24 @@ int ImageIO::loadJxl(const Glib::ustring &fname) } } // end grand decode loop - unsigned int width = info.xsize; - unsigned int height = info.ysize; + std::size_t width = info.xsize; + std::size_t height = info.ysize; allocate(width, height); - int line_length = width * 3 * 4; + std::size_t line_length = width * 3 * 4; - for (size_t row = 0; row < height; ++row) { - setScanline (row, ((const unsigned char*)buffer) + (row * line_length), 32); + for (std::size_t row = 0; row < height; ++row) { + setScanline(row, ((const unsigned char*)buffer.data()) + (row * line_length), 32); if (pl && !(row % 100)) { - pl->setProgress ((double)(row) / height); + pl->setProgress((double)(row) / height); } } - g_free(buffer); - if (pl) { - pl->setProgressStr ("PROGRESSBAR_READY"); - pl->setProgress (1.0); + pl->setProgressStr("PROGRESSBAR_READY"); + pl->setProgress(1.0); } return IMIO_SUCCESS; @@ -1484,7 +1479,7 @@ int ImageIO::load (const Glib::ustring &fname) return loadJPEG (fname); #ifdef LIBJXL } else if (hasJxlExtension(fname)) { - return loadJxl(fname); + return loadJXL(fname); #endif } else if (hasTiffExtension(fname)) { return loadTIFF (fname); diff --git a/rtengine/imageio.h b/rtengine/imageio.h index cfc54e629..3703839b2 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -91,7 +91,7 @@ public: int save (const Glib::ustring &fname) const; #ifdef LIBJXL - int loadJxl (const Glib::ustring &fname); + int loadJXL (const Glib::ustring &fname); #endif int loadPNG (const Glib::ustring &fname); diff --git a/rtengine/utils.cc b/rtengine/utils.cc index 4c4f18691..f631a410a 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -240,8 +240,7 @@ bool hasJpegExtension(const Glib::ustring& filename) #ifdef LIBJXL bool hasJxlExtension(const Glib::ustring& filename) { - const Glib::ustring extension = getFileExtension(filename); - return extension == "jxl"; + return getFileExtension(filename) == "jxl"; } #endif diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 18829d9e1..84f81ce76 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -182,12 +182,12 @@ Glib::ustring Thumbnail::xmpSidecarPath(const Glib::ustring &imagePath) return rtengine::Exiv2Metadata::xmpSidecarPath(imagePath); } -void Thumbnail::_generateThumbnailImage () +void Thumbnail::_generateThumbnailImage() { // delete everything loaded into memory delete tpp; tpp = nullptr; - delete [] lastImg; + delete[] lastImg; lastImg = nullptr; tw = options.maxThumbnailWidth; th = options.maxThumbnailHeight; @@ -211,21 +211,24 @@ void Thumbnail::_generateThumbnailImage () bool quick = false; rtengine::eSensorType sensorType = rtengine::ST_NONE; - if ( initial_ && options.internalThumbIfUntouched) { + + if (initial_ && options.internalThumbIfUntouched) { quick = true; - tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, sensorType, tw, th, 1, TRUE); + tpp = rtengine::Thumbnail::loadQuickFromRaw(fname, sensorType, tw, th, 1, TRUE); } - if ( tpp == nullptr ) { + if (!tpp) { quick = false; - tpp = rtengine::Thumbnail::loadFromRaw (fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); + tpp = rtengine::Thumbnail::loadFromRaw(fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); } cfs.sensortype = sensorType; + if (tpp) { cfs.format = FT_Raw; cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; - infoFromImage (fname); + infoFromImage(fname); + if (!quick) { cfs.width = tpp->full_width; cfs.height = tpp->full_height; @@ -234,7 +237,8 @@ void Thumbnail::_generateThumbnailImage () if (!tpp) { // this will load formats supported by imagio (jpg, png, jxl, and tiff) - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); + tpp = rtengine::Thumbnail::loadFromImage(fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); + if (tpp) { cfs.format = FT_Custom; infoFromImage(fname); @@ -243,12 +247,12 @@ void Thumbnail::_generateThumbnailImage () if (tpp) { tpp->getAutoWBMultipliers(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul); - _saveThumbnail (); + _saveThumbnail(); cfs.supported = true; - cfs.save (getCacheFileName ("data", ".txt")); + cfs.save(getCacheFileName("data", ".txt")); - generateExifDateTimeStrings (); + generateExifDateTimeStrings(); } } @@ -718,10 +722,10 @@ rtengine::IImage8* Thumbnail::processThumbImage (const rtengine::procparams::Pro MyMutex::MyLock lock(mutex); - if ( tpp == nullptr ) { + if (!tpp) { _loadThumbnail(); - if ( tpp == nullptr ) { + if (!tpp) { return nullptr; } } @@ -755,7 +759,7 @@ rtengine::IImage8* Thumbnail::upgradeThumbImage (const rtengine::procparams::Pro _generateThumbnailImage(); - if ( tpp == nullptr ) { + if (!tpp) { return nullptr; } @@ -961,7 +965,7 @@ void Thumbnail::_loadThumbnail(bool firstTrial) _loadThumbnail (false); } - if (tpp == nullptr) { + if (!tpp) { return; } } else if (!succ) { From 8c5fc60a7d3c3fb62f13f88d7c284f0ba7bd391f Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 21 Apr 2024 02:17:19 +0000 Subject: [PATCH 22/78] Make requested changes * Remove cast in scanline * Improve Glib::ustring conversion --- rtengine/imageio.cc | 36 ++++++++++++++++++++---------------- rtengine/utils.cc | 19 +++++++++++++++++++ rtengine/utils.h | 4 ++++ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 5f5573265..44297b10f 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -25,17 +25,17 @@ #include #include +#ifdef LIBJXL +#include "jxl/decode_cxx.h" +#include "jxl/resizable_parallel_runner_cxx.h" +#endif + #include #include #include #include #include -#ifdef LIBJXL -#include "jxl/decode_cxx.h" -#include "jxl/resizable_parallel_runner_cxx.h" -#endif - #ifdef _WIN32 #include #else @@ -849,8 +849,12 @@ int ImageIO::loadJXL(const Glib::ustring &fname) format.endianness = JXL_NATIVE_ENDIAN; format.align = 0; - std::string const contents = Glib::file_get_contents(fname); - std::vector const compressed(contents.begin(), contents.end()); + std::vector const compressed = getFileData(fname); + + if (compressed.empty()) { + g_printerr("Error: loadJXL failed to get data from file\n"); + return IMIO_READERROR; + } // multi-threaded parallel runner. auto runner = JxlResizableParallelRunnerMake(nullptr); @@ -894,7 +898,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) std::size_t icc_size = 0; if (JXL_DEC_SUCCESS != -#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) #else JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) @@ -907,7 +911,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) icc_profile.resize(icc_size); if (JXL_DEC_SUCCESS != -#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) JxlDecoderGetColorAsICCProfile( dec.get(), &format, _PROFILE_, icc_profile.data(), icc_profile.size()) @@ -927,9 +931,9 @@ int ImageIO::loadJXL(const Glib::ustring &fname) g_printerr("Warning: Empty ICC data.\n"); } } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { - // Note: If this assert is ever triggered, it should be changed - // to an assignment. We want the maximum bit depth the decoder - // can provide regardless of the original encoding intent. + // Note: If assert is triggered, change to assignment. + // We want maximum bit depth from the decoder, + // regardless of the original encoding intent. assert(format.data_type == JXL_TYPE_FLOAT); if (JXL_DEC_SUCCESS != @@ -953,7 +957,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) // Decoding complete. Decoder will be released automatically. break; } else if (status == JXL_DEC_NEED_MORE_INPUT) { - g_printerr("Error: Already provided all input\n"); + g_printerr("Error: Decoder needs more input data\n"); return IMIO_READERROR; } else if (status == JXL_DEC_ERROR) { g_printerr("Error: Decoder error\n"); @@ -962,7 +966,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) g_printerr("Error: Unknown decoder status\n"); return IMIO_READERROR; } - } // end grand decode loop + } // end grand decode loop std::size_t width = info.xsize; std::size_t height = info.ysize; @@ -972,10 +976,10 @@ int ImageIO::loadJXL(const Glib::ustring &fname) std::size_t line_length = width * 3 * 4; for (std::size_t row = 0; row < height; ++row) { - setScanline(row, ((const unsigned char*)buffer.data()) + (row * line_length), 32); + setScanline(row, buffer.data() + (row * line_length), 32); if (pl && !(row % 100)) { - pl->setProgress((double)(row) / height); + pl->setProgress((double)(row + 1) / height); } } diff --git a/rtengine/utils.cc b/rtengine/utils.cc index f631a410a..6a8321d1c 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "rt_math.h" #include "utils.h" @@ -222,6 +224,23 @@ void vflip(unsigned char* img, int w, int h) } } +std::vector getFileData(const Glib::ustring &filename) +{ + try { + const std::string fn = Glib::filename_from_utf8(filename); + std::ifstream instream(fn, std::ios::in | std::ios::binary); + + std::vector contents( + (std::istreambuf_iterator(instream)), + std::istreambuf_iterator()); + + instream.close(); + return contents; + } catch (...) { + return {}; + } +} + Glib::ustring getFileExtension(const Glib::ustring& filename) { const Glib::ustring::size_type lastdot_pos = filename.find_last_of('.'); diff --git a/rtengine/utils.h b/rtengine/utils.h index 7ff16c79b..5dec93f51 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -18,6 +18,8 @@ */ #pragma once +#include + #include #include @@ -43,6 +45,8 @@ constexpr typename std::underlying_type::type toUnderlying(ENUM value) return static_cast::type>(value); } +std::vector getFileData(const Glib::ustring &filename); + // Return lower case extension without the "." or "" if the given name contains no "." Glib::ustring getFileExtension(const Glib::ustring& filename); // Return true if file has .jpeg or .jpg extension (ignoring case) From 223afc3af869a8ea23d64a07203b0e028adc9efd Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Mon, 22 Apr 2024 06:36:33 +0800 Subject: [PATCH 23/78] ProcessorTargets: support PowerPC --- ProcessorTargets.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ProcessorTargets.cmake b/ProcessorTargets.cmake index 60fd1e35f..fdd4bc40a 100644 --- a/ProcessorTargets.cmake +++ b/ProcessorTargets.cmake @@ -10,6 +10,8 @@ set(PROC_TARGET_2_LABEL native CACHE STRING "Processor-2 label - use it for your # The flag is different on x86 and Arm based processors if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL arm64) set(PROC_TARGET_2_FLAGS "-mcpu=native" CACHE STRING "Processor-2 flags") +elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "ppc|powerpc") + set(PROC_TARGET_2_FLAGS "-mtune=native" CACHE STRING "Processor-2 flags") else() set(PROC_TARGET_2_FLAGS "-march=native" CACHE STRING "Processor-2 flags") endif() From 068420da605a57e60ba9b021a6c1f1009d39b1f7 Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Thu, 2 May 2024 22:12:44 -0700 Subject: [PATCH 24/78] Use camera crop factor to select Lensfun lens --- rtengine/rtlensfun.cc | 75 +++++++++++++++++++++++++++++++++++++------ rtengine/rtlensfun.h | 2 +- rtgui/lensprofile.cc | 6 ++-- 3 files changed, 69 insertions(+), 14 deletions(-) diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index fc5bb0017..df518c133 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -25,6 +25,61 @@ #include "rtlensfun.h" #include "settings.h" + +namespace +{ + +bool isCStringIn(const char *str, const char *const *list) +{ + for (auto element_ptr = list; *element_ptr; element_ptr++) { + if (!strcmp(str, *element_ptr)) { + return true; + } + } + return false; +} + +bool isNextLensCropFactorBetter(const lfLens *current_lens, const lfCamera *camera, float next_lens_crop_factor) +{ + if (!current_lens) { + // No current lens, so next lens's crop factor is + // automatically better. + return true; + } + + const float current_lens_crop_factor = current_lens->CropFactor; + + if (!camera) { + // Favor the smaller crop factor for maximum coverage. + return current_lens_crop_factor > next_lens_crop_factor; + } + + const float camera_crop_factor = camera->CropFactor; + + if (current_lens_crop_factor > camera_crop_factor) { + // Current lens's data does not cover the entire camera + // sensor. Any lens's data with a smaller crop factor is + // better. + return current_lens->CropFactor > next_lens_crop_factor; + } + + // Current lens's data covers the entire camera sensor. A lens + // with data from a larger crop factor will be more precise, but + // also must not be larger than the camera sensor's crop factor + // to maintain full coverage. + return current_lens->CropFactor < next_lens_crop_factor && + next_lens_crop_factor <= camera_crop_factor; +} + +bool isNextLensBetter(const lfCamera *camera, const lfLens *current_lens, const lfLens &next_lens, const Glib::ustring &lens_name, const Glib::ustring &next_lens_name) +{ + return isNextLensCropFactorBetter(current_lens, camera, next_lens.CropFactor) && + lens_name == next_lens_name && + (!camera || isCStringIn(camera->Mount, next_lens.Mounts)); +} + +} // namespace + namespace rtengine { @@ -460,20 +515,25 @@ LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring & } -LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) const +LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name, bool autoMatch) const { LFLens ret; if (data_ && !name.empty()) { MyMutex::MyLock lock(lfDBMutex); - if (!camera.data_) { + if (!autoMatch) { // Only the lens name provided. Try to find exact match by name. LFLens candidate; + LFLens bestCandidate; + for (auto lens_list = data_->GetLenses(); lens_list[0]; lens_list++) { candidate.data_ = lens_list[0]; - if (name == candidate.getLens()) { - return candidate; + if (isNextLensBetter(camera.data_, bestCandidate.data_, *(candidate.data_), name, candidate.getLens())) { + bestCandidate.data_ = candidate.data_; } } + if (bestCandidate.data_) { + return bestCandidate; + } } auto found = data_->FindLenses(camera.data_, nullptr, name.c_str()); for (size_t pos = 0; !found && pos < name.size(); ) { @@ -562,12 +622,7 @@ std::unique_ptr LFDatabase::findModifier( } const LFCamera c = findCamera(make, model, lensProf.lfAutoMatch()); - const LFLens l = findLens( - lensProf.lfAutoMatch() - ? c - : LFCamera(), - lens - ); + const LFLens l = findLens(c, lens, lensProf.lfAutoMatch()); bool swap_xy = false; if (rawRotationDeg >= 0) { diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index bcce77f34..1d941246f 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -121,7 +121,7 @@ public: std::vector getCameras() const; std::vector getLenses() const; LFCamera findCamera(const Glib::ustring &make, const Glib::ustring &model, bool autoMatch) const; - LFLens findLens(const LFCamera &camera, const Glib::ustring &name) const; + LFLens findLens(const LFCamera &camera, const Glib::ustring &name, bool autoMatch) const; std::unique_ptr findModifier( const procparams::LensProfParams &lensProf, diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index 0e17b3f40..5f42a1cde 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -251,7 +251,7 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa if (pp->lensProf.lfAutoMatch()) { if (metadata) { - const LFLens l = db->findLens(c, metadata->getLens()); + const LFLens l = db->findLens(c, metadata->getLens(), true); setLensfunLens(l.getLens()); } } else if (pp->lensProf.lfManual()) { @@ -522,7 +522,7 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) } else if (metadata) { const LFDatabase* const db = LFDatabase::getInstance(); const LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel(), true); - const LFLens l = db->findLens(c, metadata->getLens()); + const LFLens l = db->findLens(c, metadata->getLens(), true); setLensfunCamera(c.getMake(), c.getModel()); setLensfunLens(l.getLens()); } @@ -808,7 +808,7 @@ void LensProfilePanel::updateLensfunWarning() return; } - const LFLens l = db->findLens(LFCamera(), (*itl)[lf->lensfunModelLens.lens]); + const LFLens l = db->findLens(c, (*itl)[lf->lensfunModelLens.lens], false); const float lenscrop = l.getCropFactor(); const float camcrop = c.getCropFactor(); From 7f405aa51ff8a37c58851ebace044f3cf762397b Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Sat, 18 May 2024 14:53:33 -0700 Subject: [PATCH 25/78] Update Chinese (Simplified) translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translation provided by 十一元人民币 (syyrmb) in https://github.com/Beep6581/RawTherapee/issues/7077. --- rtdata/languages/Chinese (Simplified) | 265 ++++++++++++++++++++------ 1 file changed, 212 insertions(+), 53 deletions(-) diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index f18513c15..53aca2046 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -7,6 +7,7 @@ #006 2020-08-11 十一元人民币 #007 2021-09-24 十一元人民币 #008 2022-07-26 十一元人民币 +#009 2023-12-25 十一元人民币 #100 #101 @LANGUAGE_DISPLAY_NAME=简体中文 @@ -58,8 +59,8 @@ DYNPROFILEEDITOR_NEW;新建 DYNPROFILEEDITOR_NEW_RULE;新建动态配置规则 DYNPROFILEEDITOR_PROFILE;处理配置规则 EDITWINDOW_TITLE;图片修改 -EDIT_OBJECT_TOOLTIP;在预览窗口中显示一个允许你调整本工具的可视窗口 -EDIT_PIPETTE_TOOLTIP;若希望向曲线中添加一个调整点,请点击此按钮,按住Ctrl键并用鼠标左键点击图像预览中你想调整的地方。\n若要调整点的位置,请按住Ctrl键并用鼠标左键点击图像预览中的对应位置,然后松开Ctrl(除非你希望精调)同时按住鼠标左键,将鼠标向上/下移动以上下调整曲线中的点 +EDIT_OBJECT_TOOLTIP;在预览区显示一个允许你调整本工具的可视窗口 +EDIT_PIPETTE_TOOLTIP;若希望添加一个调整点,请单击此按钮,然后按住Ctrl键并用鼠标左键点击预览区中你想调整的地方。\n若要对该点做调整,请按住Ctrl键单击预览区中的对应位置,然后松开Ctrl(除非你希望精调)并按住鼠标左键,上/下移动鼠标即可调整曲线中的点 EXIFFILTER_APERTURE;光圈 EXIFFILTER_CAMERA;相机 EXIFFILTER_EXPOSURECOMPENSATION;曝光补偿值 (EV) @@ -107,11 +108,11 @@ EXPORT_FASTEXPORTOPTIONS;快速导出选项 EXPORT_INSTRUCTIONS;快速导出选项提供跳过占用资源和时间的处理步骤的选项,并使用快速导出设定来进行队列处理。\n此方法推荐在优先追求速度,生成低分辨率图片时使用;或是调整尺寸的图片大小适合你想得到的图片,并且又不想修改这些照片的后期处理参数时使用。 EXPORT_MAXHEIGHT;最大高度: EXPORT_MAXWIDTH;最大宽度: -EXPORT_PIPELINE;输出流水线 +EXPORT_PIPELINE;输出流水线 EXPORT_PUTTOQUEUEFAST;放入快速导出队列 EXPORT_RAW_DMETHOD;去马赛克算法 EXPORT_USE_FAST_PIPELINE;专门(对缩放大小的图片应用全部处理) -EXPORT_USE_FAST_PIPELINE_TOOLTIP;使用专门的处理流水线来对图片进行处理,通过牺牲质量来换取速度。图片的缩小操作会提前,而非在正常流水线中那样在最后进行。这能够大幅提升速度,但是输出的图片中可能会杂点较多,画质较低。 +EXPORT_USE_FAST_PIPELINE_TOOLTIP;使用专门的处理流水线来处理图片,通过牺牲质量来换取速度。图片的缩小操作会提前,而不像正常情况那样在最后进行。这能够大幅提升速度,但是输出的图片可能画质较低且有较多杂点,。 EXPORT_USE_NORMAL_PIPELINE;标准(跳过某些步骤,并在最后缩放图片) EXTPROGTARGET_1;raw EXTPROGTARGET_2;队列已处理 @@ -862,6 +863,8 @@ IPTCPANEL_RESETHINT;重置为默认配置 IPTCPANEL_SOURCE;来源 IPTCPANEL_TITLE;标题 MAIN_BUTTON_FULLSCREEN;全屏 +MAIN_BUTTON_NAVNEXT_TOOLTIP;跳转到当前编辑图片的下一张图像。\n快捷键:Shift-F4\n\n若要跳转到当前选中图片的下一张图像:\n快捷键: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;跳转到当前编辑图片的上一张图像。\n快捷键:Shift-F3\n\n若要跳转到当前选中图片的上一张图像:\nShortcut: F3 MAIN_BUTTON_PREFERENCES;参数设置 MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;将当前图片放入处理队列中\n快捷键:Ctrl+b MAIN_BUTTON_SAVE;保存图片 @@ -874,17 +877,17 @@ MAIN_FRAME_EDITOR;编辑器 MAIN_FRAME_EDITOR_TOOLTIP;编辑器\n快捷键:Ctrl-F4 MAIN_FRAME_FILEBROWSER;文件浏览器 MAIN_FRAME_FILEBROWSER_TOOLTIP;文件浏览器\n快捷键:Ctrl-F2 -MAIN_FRAME_PLACES;位置 +MAIN_FRAME_PLACES;位置 MAIN_FRAME_PLACES_ADD;添加 MAIN_FRAME_PLACES_DEL;移除 -MAIN_FRAME_QUEUE;批处理队列 +MAIN_FRAME_QUEUE;批处理队列 MAIN_FRAME_QUEUE_TOOLTIP;处理队列\n快捷键:Ctrl-F3 -MAIN_FRAME_RECENT;最近使用的文件夹 +MAIN_FRAME_RECENT;最近使用的文件夹 MAIN_MSG_ALREADYEXISTS;该文件已存在 MAIN_MSG_CANNOTLOAD;无法加载图片 MAIN_MSG_CANNOTSAVE;文件保存中出错 MAIN_MSG_CANNOTSTARTEDITOR;无法启动编辑器 -MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;请在“参数设置”中设置正确的路径 +MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;请在“参数设置”中设置正确的路径 MAIN_MSG_EMPTYFILENAME;未指定文件名! MAIN_MSG_NAVIGATOR;导航窗 MAIN_MSG_OPERATIONCANCELLED;取消 @@ -1254,7 +1257,7 @@ PROGRESSBAR_SAVETIFF;TIFF文件保存中... PROGRESSBAR_SNAPSHOT_ADDED;快照已添加 QINFO_FRAMECOUNT;%2帧 QINFO_HDR;HDR / %2帧 -QINFO_ISO;ISO +QINFO_ISO;ISO QINFO_NOEXIF;Exif数据不可用 QINFO_PIXELSHIFT;像素偏移/ %2帧 QUEUE_AUTOSTART;自动开始 @@ -1310,7 +1313,7 @@ TP_BWMIX_FILTER_RED;红 TP_BWMIX_FILTER_REDYELLOW;红-黄 TP_BWMIX_FILTER_TOOLTIP;色彩过滤能模拟使用色彩滤片所拍摄出的照片。色彩滤片会减少某个波段的光的传入,因此影响到其亮度,比如:红色滤片会让蓝天变暗。 TP_BWMIX_FILTER_YELLOW;黄 -TP_BWMIX_GAMMA;伽马矫正 +TP_BWMIX_GAMMA;伽马矫正 TP_BWMIX_GAM_TOOLTIP;矫正红绿蓝三色通道(RGB)伽马 TP_BWMIX_LABEL;黑白 TP_BWMIX_MET;方法 @@ -1383,7 +1386,7 @@ TP_COLORAPP_CIECAT_DEGREE;CAT02/16色适应 TP_COLORAPP_CONTRAST;对比度 (J) TP_COLORAPP_CONTRAST_Q;对比度 (Q) TP_COLORAPP_CONTRAST_Q_TOOLTIP;CIECAM的对比度 (Q)以视明度为基准,与Lab和RGB的对比度不同 -TP_COLORAPP_CONTRAST_TOOLTIP;与CIECAM的对比度 (J)以明度为基准,Lab和RGB的对比度不同 +TP_COLORAPP_CONTRAST_TOOLTIP;CIECAM的对比度 (J)以明度为基准,与Lab和RGB的对比度不同 TP_COLORAPP_CURVEEDITOR1;色调曲线1 TP_COLORAPP_CURVEEDITOR1_TOOLTIP;显示在CIECAM02/16应用前的L*(L*a*b*)通道直方图。\n若勾选“在曲线中显示CIECAM02/16输出直方图”,则显示CIECAM02/16应用后的J直方图。\n\n主直方图面板不会显示J的直方图\n\n最终的输出结果请参考主直方图面板 TP_COLORAPP_CURVEEDITOR2;色调曲线2 @@ -1419,7 +1422,7 @@ TP_COLORAPP_SURROUND_DARK;黑暗 TP_COLORAPP_SURROUND_DIM;昏暗 TP_COLORAPP_SURROUND_EXDARK;极暗 TP_COLORAPP_SURROUND_TOOLTIP;改变色调和色彩以考虑到输出设备的观察条件。\n\n一般:一般的光照环境(标准)。图像不会变化。\n\n昏暗:昏暗环境(如电视)。图像会略微变暗。\n\n黑暗:黑暗环境(如投影仪)。图像会变得更暗。\n\n极暗:非常暗的环境(Cutsheet)。图像会变得很暗 -TP_COLORAPP_SURSOURCE_TOOLTIP;改变色调与色彩以计入场景条件\n\n平均:平均的亮度条件(标准)。图像不被改变\n\n昏暗:较暗的场景。图像会被略微提亮\n\n黑暗:黑暗的环境。图像会被提亮\n\n极暗:非常暗的环境。图片会变得非常亮 +TP_COLORAPP_SURSOURCE_TOOLTIP;改变色调与色彩以计入场景条件\n\n一般:一般的亮度条件(标准)。图像不被改变\n\n昏暗:较暗的场景。图像会被略微提亮\n\n黑暗:黑暗的环境。图像会被提亮\n\n极暗:非常暗的环境。图片会变得非常亮 TP_COLORAPP_TCMODE_BRIGHTNESS;视明度 TP_COLORAPP_TCMODE_CHROMA;彩度 TP_COLORAPP_TCMODE_COLORF;视彩度 @@ -1430,7 +1433,7 @@ TP_COLORAPP_TCMODE_LIGHTNESS;明度 TP_COLORAPP_TCMODE_SATUR;饱和度 TP_COLORAPP_TONECIE;使用CIECAM02/16进行色调映射 TP_COLORAPP_TONECIE_TOOLTIP;禁用此选项,色调映射会在L*a*b*色彩空间中进行。\n启用此选项,色调映射会使用CIECAM进行。\n你需要启用色调映射工具来令此选项生效 -TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;观察环境的绝对亮度(一般为16 cd/m²) +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;观察条件的绝对亮度(一般为16 cd/m²) TP_COLORAPP_WBCAM;白平衡[RT+CAT02/16]+[输出] TP_COLORAPP_WBRT;白平衡[RT]+[输出] TP_COLORTONING_AUTOSAT;自动 @@ -1522,7 +1525,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_MASTER;色度—主控 TP_DIRPYRDENOISE_CHROMINANCE_METHOD;方法 TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;手动\n作用于整张图片\n用户手动控制降噪设置\n\n全局自动\n作用于整张图片\n使用9片区域来计算全局的色度噪点去除设定\n\n预览处\n作用于整张图片\n使用当前预览可见的区域来计算全局的色度噪点去除设定 TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;预览处 -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;显示在小波层级之后的,当前预览中的噪点水平。\n\n>300 噪点极多\n100-300 噪点多\n50-100 噪点略多\n<50 噪点极少\n\n一定要注意:该数值在RGB模式与在L*a*b*模式下会有不同。RGB模式下的数值相对更不精准,因为RGB模式无法完全分离亮度和色度 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;显示在小波层级之后的,当前预览中的噪点水平。\n\n>300 噪点极多\n100-300 噪点多\n50-100 噪点略多\n<50 噪点极少\n\n务必注意:该数值在RGB模式与在L*a*b*模式下会有不同。RGB模式下的数值较为不准确,因为RGB模式无法完全分离亮度和色度 TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;预览大小=%1, 中心:Px=%2 Py=%3 TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;当前预览处噪点:中位数=%1 最大=%2 TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;当前预览处噪点:中位数= - 最大= - @@ -1537,7 +1540,7 @@ TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;亮度 TP_DIRPYRDENOISE_MAIN_COLORSPACE;色彩空间 TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB -TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;对于Raw文件,RGB和L*a*b*均可用\n\n非Raw文件只可用L*a*b*空间,不论用户选择了哪个 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;对于Raw文件,RGB和L*a*b*均可用\n\n非Raw文件只能使用L*a*b*空间,不论用户选择的是什么 TP_DIRPYRDENOISE_MAIN_GAMMA;伽马 TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;伽马会令降噪的力度在不同色调之间发生变化。偏小的值会偏向阴影部分,偏大的值会偏向较亮的色调 TP_DIRPYRDENOISE_MAIN_MODE;模式 @@ -1630,7 +1633,7 @@ TP_FILMNEGATIVE_REF_LABEL;输入RGB: %1 TP_FILMNEGATIVE_REF_PICK;选择白平衡点 TP_FILMNEGATIVE_REF_TOOLTIP;为输出的正片选择一块灰色区域进行白平衡 TP_FILMSIMULATION_LABEL;胶片模拟 -TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee被设置寻找用于胶片模拟工具的Hald CLUT图像,图像所在的文件夹加载时间过长。\n前往参数设置-图片处理-Hald CLUT路径\n以寻找被使用的文件夹是哪个。你应该令该文件夹指向一个只有Hald CLUT图像而没有其他图片的文件夹,而如果你不想用胶片模拟功能,就将它指向一个空文件夹。\n\n阅读RawPedia的Film Simulation词条以获取更多信息。\n\n你现在想取消扫描吗? +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee被设置寻找用于胶片模拟工具的Hald CLUT图像,但图像所在的文件夹加载时间过长。\n前往参数设置-图片处理-Hald CLUT路径\n以寻找被使用的文件夹是哪个。你应该令该文件夹指向一个只有Hald CLUT图像而没有其他图片的文件夹。如果你不想用胶片模拟功能,就将它指向一个空文件夹。\n\n阅读RawPedia的Film Simulation词条以获取更多信息。\n\n你想取消扫描吗? TP_FILMSIMULATION_STRENGTH;力度 TP_FILMSIMULATION_ZEROCLUTSFOUND;在参数设置中设定HaldCLUT目录 TP_FLATFIELD_AUTOSELECT;自动选择 @@ -1641,7 +1644,7 @@ TP_FLATFIELD_BT_HORIZONTAL;水平 TP_FLATFIELD_BT_VERTHORIZ;垂直+水平 TP_FLATFIELD_BT_VERTICAL;垂直 TP_FLATFIELD_CLIPCONTROL;溢出控制 -TP_FLATFIELD_CLIPCONTROL_TOOLTIP;溢出控制能够避免由于平场的应用而导致的高光溢出。如果在应用平场之前就有溢出的高光,数值就会为0 +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;溢出控制能够避免使用平场而导致的高光溢出。如果在应用平场之前就有溢出的高光,数值就会为0 TP_FLATFIELD_LABEL;平场 TP_GENERAL_11SCALE_TOOLTIP;此工具的效果仅在以1:1大小预览时才可见/准确 TP_GRADIENT_CENTER;中心 @@ -1662,7 +1665,7 @@ TP_HLREC_COLOR;色彩延伸 TP_HLREC_ENA_TOOLTIP;可能会被自动色阶功能启用 TP_HLREC_LABEL;高光还原 TP_HLREC_LUMINANCE;亮度还原 -TP_HLREC_METHOD;方法: +TP_HLREC_METHOD;方法: TP_HSVEQUALIZER_CHANNEL;通道 TP_HSVEQUALIZER_HUE;H TP_HSVEQUALIZER_LABEL;HSV均衡器 @@ -1725,7 +1728,7 @@ TP_LENSPROFILE_CORRECTION_AUTOMATCH;自动选择 TP_LENSPROFILE_CORRECTION_LCPFILE;LCP文件 TP_LENSPROFILE_CORRECTION_MANUAL;手动选择 TP_LENSPROFILE_LABEL;镜头矫正档案 -TP_LENSPROFILE_LENS_WARNING;警告:制作镜头档案时相机所用的裁切系数比本图片拍摄时\n所使用的裁剪系数更大。矫正结果可能出现错误 +TP_LENSPROFILE_LENS_WARNING;警告:如果制作镜头档案时相机的裁切系数比本图片拍摄时\n所使用的裁剪系数更大。矫正结果可能出现错误 TP_LENSPROFILE_MODE_HEADER;镜头档案 TP_LENSPROFILE_USE_CA;色差 TP_LENSPROFILE_USE_GEOMETRIC;几何畸变 @@ -1813,7 +1816,7 @@ TP_LOCALLAB_DIVGR;伽马 TP_LOCALLAB_DUPLSPOTNAME;复制 TP_LOCALLAB_EDGFRA;边缘锐度 TP_LOCALLAB_EDGSHOW;显示所有工具 -TP_LOCALLAB_ELI;椭圆 +TP_LOCALLAB_ELI;椭圆 TP_LOCALLAB_ENABLE_AFTER_MASK;使用色调映射 TP_LOCALLAB_EPSBL;细节 TP_LOCALLAB_EV_NVIS;隐藏 @@ -1833,7 +1836,7 @@ TP_LOCALLAB_EXPCOMPINV;曝光补偿 TP_LOCALLAB_EXPCURV;曲线 TP_LOCALLAB_EXPGRAD;渐变滤镜 TP_LOCALLAB_EXPOSE;动态范围 & 曝光 -TP_LOCALLAB_EXPTOOL;曝光工具 +TP_LOCALLAB_EXPTOOL;曝光工具 TP_LOCALLAB_EXP_TOOLNAME;动态范围 & 曝光 TP_LOCALLAB_FATAMOUNT;数量 TP_LOCALLAB_FATANCHOR;锚点 @@ -1843,7 +1846,6 @@ TP_LOCALLAB_FATSHFRA;动态范围压缩蒙版 ƒ TP_LOCALLAB_FFTMASK_TOOLTIP;使用傅立叶变换以得到更高的质量(处理用时与内存占用会上升) TP_LOCALLAB_FFTW;ƒ - 使用快速傅立叶变换 TP_LOCALLAB_FFTWBLUR;ƒ - 永远使用快速傅立叶变换 -TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image TP_LOCALLAB_GAM;伽马 TP_LOCALLAB_GAMC;伽马 TP_LOCALLAB_GAMFRA;色调响应曲线(TRC) @@ -1887,7 +1889,7 @@ TP_LOCALLAB_LOG2FRA;观察条件 TP_LOCALLAB_LOGAUTO;自动 TP_LOCALLAB_LOGEXP;所有工具 TP_LOCALLAB_LOGFRA;场景条件 -TP_LOCALLAB_LOGIMAGE_TOOLTIP;将CIECAM的相关参数一同进行考虑,参数包括:对比度(J),饱和度(s),以及对比度(Q),视明度(Q),明度(J),视彩度(M)(在高级模式下) +TP_LOCALLAB_LOGIMAGE_TOOLTIP;将CIECAM的相关参数一同加入计算,参数包括:对比度(J),饱和度(s),以及对比度(Q),视明度(Q),明度(J),视彩度(M)(在高级模式下) TP_LOCALLAB_LOGLIGHTL;明度 (J) TP_LOCALLAB_LOGLIGHTL_TOOLTIP;与L*a*b*的明度相近。会考虑到感知色彩的变化 TP_LOCALLAB_LOGLIGHTQ;视明度 (Q) @@ -2090,7 +2092,7 @@ TP_RAW_HPHD;HPHD TP_RAW_IGV;IGV TP_RAW_IMAGENUM;子图像 TP_RAW_IMAGENUM_SN;SN模式 -TP_RAW_IMAGENUM_TOOLTIP;某些Raw文件包含多张子图像(宾得/索尼的像素偏移,宾得的3张合并HDR,佳能的双像素,富士的EXR)。\n\n当使用除像素偏移外的任意一个去马赛克算法时,本栏用来选择哪帧子图像被处理。\n\n当在像素偏移Raw文件上使用像素偏移去马赛克算法时,所有子图像都会被使用,此时本栏用来选择哪帧子图像被用来处理动体 +TP_RAW_IMAGENUM_TOOLTIP;某些Raw文件包含多张子图像(宾得/索尼的像素偏移,宾得的3张合并HDR,佳能的双像素,富士的EXR)。\n\n当使用除像素偏移外的任意一个去马赛克算法时,本栏用来选择哪张子图像被处理。\n\n当在像素偏移Raw文件上使用像素偏移去马赛克算法时,所有子图像都会被使用,此时本栏用来选择哪张子图像被用来处理动体 TP_RAW_LABEL;去马赛克 TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;LMMSE优化步长 @@ -2125,7 +2127,7 @@ TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;在图像上用绿色蒙版显示动体区 TP_RAW_PIXELSHIFTSIGMA;模糊半径 TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;默认半径值1.0一般对于原生ISO来说足够好。\n对于高ISO照片,提高此值,5.0是不错的起始点。\n在改变此值的同时关注动体蒙版 TP_RAW_PIXELSHIFTSMOOTH;顺滑过渡 -TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;让存在动体的区域与没有动体之间的区域之间顺滑地过渡。\n将此值设置为0以禁用顺滑过渡\n将此值设置为1以使用AMaZE/LMMSE算法(这取决于你是否选择了“使用LMMSE”)所解出的你所选择的那一帧图像,如果你选择了“使用中值”,那么就会根据通过所有图像计算出的中值解出图像 +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;让存在动体的区域与没有动体之间的区域之间顺滑地过渡。\n将此值设置为0以禁用顺滑过渡\n将此值设置为1以使用AMaZE/LMMSE算法(这取决于你是否选择了“使用LMMSE”)所解出的你所选择的那一张图像,如果你选择了“使用中值”,那么就会根据通过所有图像计算出的中值解出图像 TP_RAW_RCD;RCD TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;拜耳阵列传感器 @@ -2139,7 +2141,7 @@ TP_RESIZE_H;高: TP_RESIZE_HEIGHT;高度 TP_RESIZE_LABEL;调整大小 TP_RESIZE_LANCZOS;Lanczos算法 -TP_RESIZE_METHOD;方法: +TP_RESIZE_METHOD;方法: TP_RESIZE_NEAREST;最近点 TP_RESIZE_SCALE;缩放倍数 TP_RESIZE_SPECIFY;调整: @@ -2164,7 +2166,7 @@ TP_RGBCURVES_CHANNEL;通道 TP_RGBCURVES_GREEN;G TP_RGBCURVES_LABEL;RGB曲线 TP_RGBCURVES_LUMAMODE;亮度模式 -TP_RGBCURVES_LUMAMODE_TOOLTIP;亮度模式允许改变R、G、B三个通道的亮度分配而不影响色彩 +TP_RGBCURVES_LUMAMODE_TOOLTIP;亮度模式允许改变R、G、B三个通道的亮度分配而不影响色彩 TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;角度 TP_ROTATE_LABEL;旋转 @@ -2316,7 +2318,7 @@ TP_WAVELET_EDVAL;力度 TP_WAVELET_FINAL;最终润色 TP_WAVELET_FINCFRAME;最终局部反差 TP_WAVELET_FINEST;最精细 -TP_WAVELET_HIGHLIGHT;精细层级范围 +TP_WAVELET_HIGHLIGHT;精细层级亮度范围 TP_WAVELET_HS1;全部亮度范围 TP_WAVELET_HS2;选择性亮度范围 TP_WAVELET_HUESKIN;肤色和其它色彩 @@ -2445,6 +2447,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !EXIFPANEL_BASIC_GROUP;Basic !EXIFPANEL_VALUE_NOT_SHOWN;Not shown !FILEBROWSER_POPUPSORTBY;Sort Files +!FILEBROWSER_SHOWRECURSIVE;Show images in sub-folders recursively. !FILECHOOSER_FILTER_EXECUTABLE;Executable files !GENERAL_OTHER;Other !HISTORY_MSG_112;--unused-- @@ -3002,7 +3005,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J !HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold !HISTORY_MSG_1081;Local - CIECAM Sigmoid blend -!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1082;Local - CIECAM Auto threshold !HISTORY_MSG_1083;Local - CIECAM Hue !HISTORY_MSG_1084;Local - Uses Black Ev - White Ev !HISTORY_MSG_1086;Local - Jz contrast @@ -3080,15 +3083,22 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !HISTORY_MSG_ICM_AINTENT;Abstract profile intent !HISTORY_MSG_ICM_BLUX;Primaries Blue X !HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_CAT;Matrix adaptation !HISTORY_MSG_ICM_GAMUT;Gamut control !HISTORY_MSG_ICM_GREX;Primaries Green X !HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_MIDTCIE;Midtones !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D !HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type !HISTORY_MSG_ICM_PRESER;Preserve neutral !HISTORY_MSG_ICM_REDX;Primaries Red X !HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_REFI;Refinement Colors +!HISTORY_MSG_ICM_SHIFTX;Refinement Colors - shift x +!HISTORY_MSG_ICM_SHIFTY;Refinement Colors - shift y +!HISTORY_MSG_ICM_SMOOTHCIE;Smooth highlights +!HISTORY_MSG_ICM_TRCEXP;Abstract Profile !HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma !HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method !HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method @@ -3096,7 +3106,64 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method !HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot +!HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;Local Cie mask blur contrast +!HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;Local Cie mask blur fftw +!HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;Local Cie mask blur radius +!HISTORY_MSG_LOCAL_CIEMASK_CHH;Local Cie mask curve hh +!HISTORY_MSG_LOCAL_CIEMASK_HIGH;Local Cie mask highlights +!HISTORY_MSG_LOCAL_CIEMASK_SHAD;Local Cie mask shadows +!HISTORY_MSG_LOCAL_CIEMASK_STRU;Local Cie mask structure +!HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local Cie mask structure as tool +!HISTORY_MSG_LOCAL_CIEMASK_WLC;Local CIECAM mask wavelet Lc +!HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local CIECAM mask wavelet levels +!HISTORY_MSG_LOCAL_CIE_ANGGRAD;Local CIECAM - gradient angle +!HISTORY_MSG_LOCAL_CIE_BLACKS;Local CIECAM - Blacks distribution +!HISTORY_MSG_LOCAL_CIE_BLUXL;Local CIECAM - Blue X +!HISTORY_MSG_LOCAL_CIE_BLUYL;Local CIECAM - Blue Y +!HISTORY_MSG_LOCAL_CIE_BRICOMP;Local CIECAM Brightness compression +!HISTORY_MSG_LOCAL_CIE_BRICOMPTH;Local CIECAM Brightness compression threshold +!HISTORY_MSG_LOCAL_CIE_BWCIE;Local CIECAM - black and white +!HISTORY_MSG_LOCAL_CIE_CAT;Matrix adaptation +!HISTORY_MSG_LOCAL_CIE_DETAILJZ;Local JzCzHz Local contrast +!HISTORY_MSG_LOCAL_CIE_ENAMASKALL;Local CIECAM All mask tools +!HISTORY_MSG_LOCAL_CIE_EXPPRECAM;Local CIECAM Pre-Cam +!HISTORY_MSG_LOCAL_CIE_GAM;Local CIECAM Gamma +!HISTORY_MSG_LOCAL_CIE_GAMUTCIE;Local CIECAM Gamut +!HISTORY_MSG_LOCAL_CIE_GREXL;Local CIECAM - Green X +!HISTORY_MSG_LOCAL_CIE_GREYL;Local CIECAM - Green Y +!HISTORY_MSG_LOCAL_CIE_ILL;Local CIECAM TRC Illuminant +!HISTORY_MSG_LOCAL_CIE_LOGCIEQ;Local CIECAM Log encoding Q +!HISTORY_MSG_LOCAL_CIE_MIDT;Local CIECAM Mid Tones +!HISTORY_MSG_LOCAL_CIE_NORM;Local CIECAM Normalize L +!HISTORY_MSG_LOCAL_CIE_PRIM;Local CIECAM TRC Primaries +!HISTORY_MSG_LOCAL_CIE_REDXL;Local CIECAM - Red X +!HISTORY_MSG_LOCAL_CIE_REDYL;Local CIECAM - Red Y +!HISTORY_MSG_LOCAL_CIE_REFI;Local CIECAM Refinement Colors +!HISTORY_MSG_LOCAL_CIE_SATCIE;Local CIECAM - Saturation control +!HISTORY_MSG_LOCAL_CIE_SHIFTXL;Local CIECAM - Shift x +!HISTORY_MSG_LOCAL_CIE_SHIFTYL;Local CIECAM - Shift y +!HISTORY_MSG_LOCAL_CIE_SIG;Sigmoid +!HISTORY_MSG_LOCAL_CIE_SIGADAP;Local CIECAM Sigmoid adaptability +!HISTORY_MSG_LOCAL_CIE_SIGMET;Local CIECAM - Sigmoid method +!HISTORY_MSG_LOCAL_CIE_SLOP;Local CIECAM - Slope +!HISTORY_MSG_LOCAL_CIE_SLOPESMO;Local CIECAM - Gray balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOB;Local CIECAM - Blue balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOG;Local CIECAM - Green balance +!HISTORY_MSG_LOCAL_CIE_SLOPESMOR;Local CIECAM - Red balance +!HISTORY_MSG_LOCAL_CIE_SMOOTH;Local CIECAM - Scale Yb Scene +!HISTORY_MSG_LOCAL_CIE_SMOOTHMET;Local CIECAM - Smooth lights method +!HISTORY_MSG_LOCAL_CIE_SMOOTHYB;Local CIECAM - Scale Yb Viewing +!HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;Local CIECAM - levels - luminosity mode +!HISTORY_MSG_LOCAL_CIE_STRGRAD;Local CIECAM - gradient strength L +!HISTORY_MSG_LOCAL_CIE_STRLOG;Local CIECAM - Log encoding strength +!HISTORY_MSG_LOCAL_CIE_TRC;Local CIECAM - TRC +!HISTORY_MSG_LOCAL_CIE_WHITES;Local CIECAM - Whites distribution +!HISTORY_MSG_LOCAL_DEHAZE_BLACK;Local - Dehaze - black !HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift +!HISTORY_MSG_LOCAL_LOG_BLACKS;Local Log - Blacks distribution +!HISTORY_MSG_LOCAL_LOG_COMPR;Local Log - Compress brightness +!HISTORY_MSG_LOCAL_LOG_SAT;Local Log - Saturation control +!HISTORY_MSG_LOCAL_LOG_WHITES;Local Log - Whites distribution !HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation !HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera !HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera @@ -3235,8 +3302,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !IPTCPANEL_TRANSREFERENCE;Job ID !IPTCPANEL_TRANSREFERENCEHINT;Enter a number or identifier needed for workflow control or tracking. !MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator -!MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 -!MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !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_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. !MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. @@ -3244,6 +3309,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_TONE_EQUALIZER;Tone equalizer !PARTIALPASTE_VIBRANCE;Vibrance +!PREFERENCES_BROWSERECURSIVEDEPTH;Browse sub-folders depth +!PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;Follow symbolic links when browsing sub-folders +!PREFERENCES_BROWSERECURSIVEMAXDIRS;Maximum sub-folders !PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CIE;Ciecam @@ -3264,12 +3332,15 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. !PREFERENCES_LENSPROFILESDIR;Lens profiles directory !PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) +!PREFERENCES_MAX_ZOOM_TITLE;Maximum zoom !PREFERENCES_METADATA;Metadata !PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars !PREFERENCES_METADATA_SYNC_NONE;Off !PREFERENCES_METADATA_SYNC_READ;Read only !PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional +!PREFERENCES_SPOTLOC;Define Spot method for Local Adjustments !PREFERENCES_TAB_FAVORITES;Favorites +!PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;Load/Save thumbnail rank and color from/to XMP sidecars !PREFERENCES_TOOLPANEL_AVAILABLETOOLS;Available Tools !PREFERENCES_TOOLPANEL_CLONE_FAVORITES;Keep favorite tools in original locations !PREFERENCES_TOOLPANEL_CLONE_FAVORITES_TOOLTIP;If set, favorite tools will appear in both the favorites tab and their original tabs.\n\nNote: Enabling this option may result in a slight delay when switching tabs. @@ -3292,6 +3363,27 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) !PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QUEUE_DESTPREVIEW_TITLE;Select a thumbnail to preview its destination path here +!QUEUE_DESTPREVIEW_TOOLTIP;Destination path for the first selected image appears here +!QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;Show or hide a help panel with instructions for creating location templates +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;If you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p-3/converted/%P-4/%f +!QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;Common examples +!QUEUE_LOCATION_TEMPLATE_HELP_INTRO;The output template field allows you to to dynamically customize the destination folder and filename. When you include certain specifiers, which begin with %, they are replaced by the program when each file is being saved.\n\nThe sections below describe each type of specifier. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;Using this pathname as an example: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;The meanings of the formatting strings are: +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;/home/tom/photos/2010-10-31/photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;D:\tom\photos\2010-10-31\photo1.raw +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;The %dN, %d-N, %pN, %p-N, %PN and %P-N (N = 1..9) specifiers will be replaced by elements of the image file's directory path.\nThe format specifiers operate as follows:\n %dN = Nth directory from the end of the path\n %d-N = Nth directory from the start of the path\n %pN = all directories up to the Nth from the end of the path\n %p-N = the first N directories in the path\n %PN = the last N directories in the path\n %P-N = all directories from the Nth to the end of the path\n %f = base filename (no extension) +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;For Windows paths, %d-1 is the drive letter and colon, and %d-2 is the base directory on that drive. +!QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;Directories and partial paths +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used. +!QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;Rank +!QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2nd result is different: +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'. +!QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;Position/sequence in queue +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;Three different date/time values may be used in templates:\n %tE"%Y-%m-%d" = when export started\n %tF"%Y-%m-%d" = when file was last saved\n %tP"%Y-%m-%d" = when photo was taken\nThe quoted string defines the format of the resulting date and/or time. The format string %tF"%Y-%m-%d" is just one example. The string can use all conversion specifiers defined for the g_date_time_format function (see https://docs.gtk.org/glib/method.DateTime.format.html).\n\nExample format strings: +!QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;Date and time +!QUEUE_LOCATION_TEMPLATE_HELP_TITLE;Creating an output template !SAMPLEFORMAT_1;8-bit unsigned !SAMPLEFORMAT_2;16-bit unsigned !SAMPLEFORMAT_4;24-bit LogLuv @@ -3308,12 +3400,16 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !SORT_BY_NAME;By Name !SORT_BY_RANK;By Rank !SORT_DESCENDING;Descending +!TC_LOCALLAB_PRIM_SHIFTX;Shift x +!TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;In combination with "Refine colors" allows you:\n 1) for low values adjust the image purity.\n 2) for higher values, carry out moderate Color Toning.\n 3) Be careful not to go outside the CIE xy diagram. +!TC_LOCALLAB_PRIM_SHIFTY;Shift y !TC_PRIM_BLUX;Bx !TC_PRIM_BLUY;By !TC_PRIM_GREX;Gx !TC_PRIM_GREY;Gy !TC_PRIM_REDX;Rx !TC_PRIM_REDY;Ry +!TC_PRIM_REFI;Refine colors (white-point) !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -3383,6 +3479,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_ICM_APPLYLOOKTABLE;Look table !TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only available if the selected DCP has one. !TP_ICM_BPC;Black Point Compensation +!TP_ICM_BW;Black and White !TP_ICM_DCPILLUMINANT;Illuminant !TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolated !TP_ICM_DCPILLUMINANT_TOOLTIP;Select which embedded DCP illuminant to employ. Default is 'interpolated' which is a mix between the two based on white balance. The setting is only available if a dual-illuminant DCP with interpolation support is selected. @@ -3403,8 +3500,15 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. -!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with three main uses - channel mixer, restore image color (saturation), calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. !TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CAT;Matrix adaptation +!TP_ICM_WORKING_CAT_BRAD;Bradford +!TP_ICM_WORKING_CAT_CAT02;Cat02 +!TP_ICM_WORKING_CAT_CAT16;Cat16 +!TP_ICM_WORKING_CAT_TOOLTIP;Performs the chromatic adaptation of the XYZ conversion matrix. Default Bradford +!TP_ICM_WORKING_CAT_VK;Von Kries +!TP_ICM_WORKING_CAT_XYZ;XYZ scale !TP_ICM_WORKING_CIEDIAG;CIE xy diagram !TP_ICM_WORKING_ILLU;Illuminant !TP_ICM_WORKING_ILLU_1500;Tungsten 1500K @@ -3416,7 +3520,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_ICM_WORKING_ILLU_D65;D65 !TP_ICM_WORKING_ILLU_D80;D80 !TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_E;E !TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_NON;None !TP_ICM_WORKING_PRESER;Preserves Pastel tones !TP_ICM_WORKING_PRIM;Destination primaries !TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. @@ -3428,10 +3534,13 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_ICM_WORKING_PRIM_BST;BestRGB !TP_ICM_WORKING_PRIM_CUS;Custom (sliders) !TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_FREE;Custom LA (sliders) !TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +!TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max stdA !TP_ICM_WORKING_PRIM_PROP;ProPhoto !TP_ICM_WORKING_PRIM_REC;Rec2020 !TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_TOOLTIP;Destination primaries (Advanced): which allows you to change the destination primaries to restore or change image color (saturation), the color balance is significantly preserved when the 'Working Profile' and the 'Destination primaries' are not too different, 'Working Profiles' are not modified. Perform a gamut control.\nWhen 'Custom LA (sliders)' is selected you can modify the values of the 3 primaries Red, Green, Blue for X and Y. !TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC_18;Prophoto g=1.8 !TP_ICM_WORKING_TRC_22;Adobe g=2.2 @@ -3458,7 +3567,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_ACTIV;Luminance only !TP_LOCALLAB_ADJ;Equalizer Color !TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. -!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 or Color Appearance and Lighting is used.\n\nDefault: Munsell.\nMunsell correction: fixes Lab mode hue drifts due to non-linearity, when chromaticity is changed (Uniform Perceptual Lab).\nLab: applies a gamut control, in relative colorimetric, Munsell is then applied.\nXYZ Absolute, applies gamut control, in absolute colorimetric, Munsell is then applied.\nXYZ Relative, applies gamut control, in relative colorimetric, Munsell is then applied. +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\n\nDefault: Munsell only.\nMunsell only, fixes Lab mode hue drifts due to non-linearity, when chromaticity is changed (Uniform Perceptual Lab).\nLab, applies a gamut control, in relative colorimetric, Munsell is then applied.\nXYZ Absolute, applies gamut control, in absolute colorimetric, Munsell is then applied.\nXYZ Relative, applies gamut control, in relative colorimetric, Munsell is then applied. The result is not the same as Lab. !TP_LOCALLAB_AVOIDMUN;Munsell correction only !TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. !TP_LOCALLAB_AVOIDRAD;Soft radius @@ -3482,9 +3591,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). !TP_LOCALLAB_BLWH;All changes forced in Black-and-White !TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BWEVNONE;None +!TP_LOCALLAB_BWEVSIG;Activated +!TP_LOCALLAB_BWEVSIGLOG;Sigmoid & Log-Encoding !TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev !TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) -!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16 (experimental). Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. For example to match Cam16 processing with the maximum monitor brightness of 400cd/m2. !TP_LOCALLAB_CAMMODE_CAM16;CAM 16 !TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz !TP_LOCALLAB_CH;CL - LC @@ -3500,6 +3612,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast !TP_LOCALLAB_CIELIGHTFRA;Lighting !TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIE_SMOOTHFRAME;Highlight attenuation & Levels +!TP_LOCALLAB_CIE_SMOOTH_EV;Ev based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based +!TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based +!TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels +!TP_LOCALLAB_CIE_SMOOTH_NONE;None !TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. !TP_LOCALLAB_CLARICRES;Merge chroma !TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images @@ -3511,10 +3629,14 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_CLARITYML;Clarity !TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. !TP_LOCALLAB_CLIPTM;Clip restored data (gain) -!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button in Settings will only work if you have activated 'Sharpening' or 'Soft Light and Original Retinex' or 'Blur/Grain and Denoise' or 'Dehaze and Retinex' or 'Contrast by Detail Levels' in 'Add tool to current spot' menu.\nFor others tools Preview ΔE button is 'in the tool' - to be able to preview ΔE with several tools enabled, use preferably Mask and modifications. !TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORFRAME;Dominant color !TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPRCIE;Brightness compression +!TP_LOCALLAB_COMPRCIETH;Compression threshold !TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_COMPRLOG_TOOLTIP;This algorithm compress the data before log conversion, above the theshold slider value. To use in conjunction with Whites distribution. !TP_LOCALLAB_CONTCOL;Contrast threshold !TP_LOCALLAB_CONTFRA;Contrast by level !TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. @@ -3530,11 +3652,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. !TP_LOCALLAB_CURVNONE;Disable curves !TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAZE_BLACK;Black !TP_LOCALLAB_DELTAD;Delta balance !TP_LOCALLAB_DELTAEC;ΔE Image mask !TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask !TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask -!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. !TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. !TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). !TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. @@ -3550,8 +3673,10 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum spot size: 128x128. !TP_LOCALLAB_DETAILFRA;Edge detection - DCT !TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +!TP_LOCALLAB_DISAB_CIECAM;Disable Ciecam or Weak Jz surround !TP_LOCALLAB_ENABLE_MASK;Enable mask !TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENABLE_MASKALL;Enable all mask tools !TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. !TP_LOCALLAB_ENH;Enhanced !TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise @@ -3559,13 +3684,14 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. !TP_LOCALLAB_ESTOP;Edge stopping !TP_LOCALLAB_EV_DUPL;Copy of -!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\nUse 'Scope' (Excluding) to set the exclusion intensity.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems.\n\n'Global' allows you to use the local adjustment tools on the whole image, without using deltaE or transitions. +!TP_LOCALLAB_EXMAIN;Global !TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). !TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. !TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' !TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. !TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. -!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. !TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. !TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. !TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. @@ -3581,6 +3707,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. !TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) !TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image !TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. !TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. !TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. @@ -3675,8 +3802,10 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. !TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. !TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. -!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid -!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCIE;Log encoding +!TP_LOCALLAB_LOGCIEQ;Log Encoding Q (with Ciecam) +!TP_LOCALLAB_LOGCIEQ_TOOLTIP;Activating the checkbox allows you to switch between log encoding based on the 3 RGB channels, and log encoding based solely on Ciecam’s brightness (Q) channel.\nUsing the Q channel instead of the RGB channels helps avoid undesirable edge effects such as hue and saturation shifts.\nHowever, the settings are more difficult to optimise because Q is unbounded and Ciecam alters the data to take into account the surround conditions, simultaneous contrast etc.:\nThe user may have to adjust the following:\n Scene conditions: Mean luminance (Yb), Whites & Blacks distribution, Black Ev, White Ev.\n Source Data Adjustments : Brightness compression, Strength.\n\nNote: when using Log Encoding (Q), be careful not to activate the Disable Ciecam option in the Scene Conditions, Surround menu. +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, White and Black distribution, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using 'Log encoding' with Brightness compression. !TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) !TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. !TP_LOCALLAB_LOGCONQL;Contrast (Q) @@ -3684,13 +3813,14 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_LOGCONTL;Contrast (J) !TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. !TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. -!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. !TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. !TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. !TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. !TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. !TP_LOCALLAB_LOGLIN;Logarithm mode !TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGPFRA2;Log Encoding settings !TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. !TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. !TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. @@ -3751,7 +3881,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. !TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. !TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. -!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Enable in Mask & modifications) !TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) !TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. !TP_LOCALLAB_MEDIAN;Median Low @@ -3777,7 +3907,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_MERONE;Normal !TP_LOCALLAB_MERSAT;Saturation !TP_LOCALLAB_MERSEV;Soft Light (legacy) -!TP_LOCALLAB_MERSEV0;Soft Light Illusion !TP_LOCALLAB_MERSEV1;Soft Light W3C !TP_LOCALLAB_MERSEV2;Hard Light !TP_LOCALLAB_MERSIX;Divide @@ -3787,6 +3916,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_MERTWE;Exclusion !TP_LOCALLAB_MERTWO;Subtract !TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MIDTCIE;Midtones !TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 !TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. !TP_LOCALLAB_MRFIV;Background @@ -3817,6 +3947,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression !TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ !TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PRECAMGAMUT_TOOLTIP;If checked ensures a gamut control just after primary conversion to XYZ matrix. +!TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. In combination with "Shift x" and "Shift y" allows you to carry out moderate Color Toning. +!TP_LOCALLAB_PRECAMREFI_TOOLTIP;Allows you to move the white-point in such a way that it approaches the dominant color. This action modifies the purity. +!TP_LOCALLAB_PRECAM_TOOLTIP;This 'Source Data Adjustments' modifies: a)the Dynamic Range using Log encoding; b) the tones of the image and primaries(simplified Abstract Profile) and also midtones, just before the Ciecam process. The values are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\n\n\n-Destination primaries: which allows you to change the destination primaries to restore or change image color (saturation), the color balance is 'significantly' preserved when the 'Working Profile' and the 'Destination primaries' are not too different (be careful), 'Working Profiles' are not modified.\nYou can also finely adapt the primaries and the illuminant (white-point).\nMoving a primary away from the white point reduces saturation and vice versa. Pay attention to the gamut. +!TP_LOCALLAB_PRIMILLFRAME;Primaries & Illuminant !TP_LOCALLAB_QUAL_METHOD;Global quality !TP_LOCALLAB_QUANONEALL;Off !TP_LOCALLAB_QUANONEWAV;Non-local means only @@ -3845,6 +3980,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. !TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. !TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATCIE;Saturation control !TP_LOCALLAB_SCALEGR;Scale !TP_LOCALLAB_SCALERETI;Scale !TP_LOCALLAB_SCALTM;Scale @@ -3855,7 +3991,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. !TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. !TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. -!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. !TP_LOCALLAB_SHARDAMPING;Damping !TP_LOCALLAB_SHARFRAME;Modifications !TP_LOCALLAB_SHORTC;Short Curves 'L' Mask @@ -3885,15 +4021,39 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_SHOWT;Mask and modifications !TP_LOCALLAB_SHOWVI;Mask and modifications !TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). -!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGBLACKSSCIE;Blacks distribution +!TP_LOCALLAB_SIGCIE;Sigmoid +!TP_LOCALLAB_SIGFRA;Sigmoid Q +!TP_LOCALLAB_SIGGAMJCIE;Gamma !TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMOID16_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' and 'Sigmoid Q'.\nSigmoid Q: three sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Adaptability weights the action of the sigmoid by action on the internal exponential function. !TP_LOCALLAB_SIGMOIDBL;Blend -!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDLOGAUTO;Auto threshold +!TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;If the comboxbox selection 'Black Ev and White Ev' is 'Sigmoid and Log encoding' instead of 'Sigmoid only', the two algorithms 'Log encoding' and 'Sigmoid' are used together. +!TP_LOCALLAB_SIGMOIDNORMCIE;Normalize Luminance +!TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;Blend acts on the final aspect of the image, contrast and luminance : ratio between original and output image. +!TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image take into account those of the original.\nAll the adjustments acting on J or Q are taken into account, including those which are not relative to Sigmoid Q. +!TP_LOCALLAB_SIGMOIDQJ;Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;When the comboxbox selection'Uses Black Ev and White Ev' is 'Sigmoid and Log encoding Q' or 'Log encoding instead of Sigmoid' checked. This algorithm compress the data above the threshold slider value. This last value stands for brightness (Q) should be a near the possible value 'Compression treshold' (calculate when 'Auto threshold" checked, often > 1). +!TP_LOCALLAB_SIGMOIDSENSI;Adaptability !TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) -!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP;Allows you, in Automatic, when the dynamic range of the image is high, to change the distribution of lights in whites and deep blacks.\nCan be used with Log encoding or Sigmoid with Black Ev and White Ev enabled.\n\nThe algorithm does not change the basic data, but acts on the components necessary to calculate the Dynamic range, Black Ev, White Ev and the Gray point. +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the 'Jz' and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SIGSLOPJCIE;Slope +!TP_LOCALLAB_SIGTRCCIE;Source Data Adjustments +!TP_LOCALLAB_SIGWHITESCIE;Whites distribution !TP_LOCALLAB_SLOMASKCOL;Slope !TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOPESMOOTH;Gray balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) +!TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) !TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SMOOTHCIE;Highlight attenuation +!TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode +!TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene +!TP_LOCALLAB_SMOOTHCIE_TOOLTIP;Completes the processing carried out by gamma, slope and midtones by causing a slight lowering of lights. Please note this does not replace Highlight reconstruction.\n\nGamma - Slope - based: choice (Standard and Advanced) allows you to simulate a "Tone mapping" using: a) Scene conditions: Black-Ev, White-Ev, Mean luminance (Yb%); b) Viewing conditions: Mean luminance (Yb%).\nScale Yb Scene is function of White-Ev. +!TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing !TP_LOCALLAB_SOFT;Soft Light & Original Retinex !TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. !TP_LOCALLAB_SOFTRADIUSCOL;Soft radius @@ -3903,12 +4063,13 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_SPECIAL;Special use of RGB curves !TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. !TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTHCIELOG;Strength !TP_LOCALLAB_STRUC;Structure !TP_LOCALLAB_STRUCCOL;Spot structure !TP_LOCALLAB_STRUCCOL1;Spot structure !TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. !TP_LOCALLAB_STRUMASKCOL;Structure mask strength -!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). !TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! !TP_LOCALLAB_STYPE;Shape method !TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. @@ -3931,11 +4092,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. !TP_LOCALLAB_TOOLMASK;Mask Tools !TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. -!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). !TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. !TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain !TP_LOCALLAB_TRANSMISSIONMAP;Transmission map !TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_TRCFRAME;Tone Response Curve & Midtones !TP_LOCALLAB_USEMASK;Laplacian !TP_LOCALLAB_VART;Variance (contrast) !TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. @@ -4243,7 +4405,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_WBALANCE_MULLABEL;Multipliers: r=%1 g=%2 b=%3 !TP_WBALANCE_MULLABEL_TOOLTIP;Values given for information purposes. You cannot change them. !TP_WBALANCE_OBSERVER10;Observer 10° instead of Observer 2° -!TP_WBALANCE_OBSERVER10_TOOLTIP;The color management in Rawtherapee (White balance, channel multipliers, highlight recovery,...) uses the spectral data of the illuminants and colors. Observer is an important parameter of this management which takes into account the angle of perception of the eye. In 1931 it was fixed at 2° (privileges the use of the cones). In 1964 it was fixed at 10° (privileges the use of the cones, but partially takes into account the rods).\nTo avoid a (rare) drift of the colors due to the choice Observer 10° - probably due to the conversion matrix - Observer 2° must be selected.\nIn a majority of cases Observer 10° (default) will be a more relevant choice. +!TP_WBALANCE_OBSERVER10_TOOLTIP;The color management in Rawtherapee (White balance, channel multipliers, highlight recovery,...) uses the spectral data of the illuminants and colors. Observer is an important parameter of this management which takes into account the angle of perception of the eye. In 1931 it was fixed at 2° (privileges the use of the cones). In 1964 it was fixed at 10° (privileges the use of the cones, but partially takes into account the rods).\nIn the rare case of a color drift with "Observer 2°" (probably due to the conversion matrix) “Observer 10°” must be selected. !TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 !TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. !TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 @@ -4251,8 +4413,5 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键:- !TP_WBALANCE_SOLUX47;Solux 4700K (vendor) !TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) !TP_WBALANCE_STUDLABEL;Correlation factor: %1 Passes:%2 Worst_alt=%3 -!TP_WBALANCE_STUDLABEL0;Correlation factor: %1 Passes:%2 Alt=%3 !TP_WBALANCE_STUDLABEL1;Correlation factor: %1 Passes:%2 Best_alt=%3 !TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good.\n\nPasses : number of passes made.\nAlt_temp : Alternative temperature. -!//TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;By default when "Inpaint opposed" is activated, purple colors are not taken into account. However, if the image does not need highlight reconstruction, or if this image naturally contains purple tints (flowers, etc.), it may be necessary to deactivate, to take into account all the colors. -!//TP_WBALANCE_ITCWB_FORCED;Forces use of the entire CIE diagram From 422a11866a26ca984f7948d33423890fff2a3182 Mon Sep 17 00:00:00 2001 From: Richard E Barber Date: Sun, 19 May 2024 05:12:07 -0700 Subject: [PATCH 26/78] Bump codeql actions to v3 v2 is deprecated in github actions. Fixes warnings in codeql analysis. --- .github/workflows/codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f57786098..5cb91e47a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout source - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -77,7 +77,7 @@ jobs: echo "REF_NAME_FILTERED=$REF_NAME_FILTERED" >> $GITHUB_ENV - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} @@ -90,6 +90,6 @@ jobs: mv AppDir/usr/bin/share AppDir/usr/ - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{matrix.language}}" From b57679ac158dc72156fff1ab90e9d91be1c91440 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Sat, 30 Mar 2024 21:09:04 +0100 Subject: [PATCH 27/78] dcraw: add Panasonic DC-G9M2 to adobe_coeffs --- rtengine/dcraw.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 56d400d3d..6c54e0495 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -8889,6 +8889,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-G9M2", 0, 0, + { 8325,-3456,-623,-4330,12089,2528,-860,2646,5984 } }, { "Panasonic DC-G9", 15, 0xfff, { 7685,-2375,-634,-3687,11700,2249,-748,1546,5111 } }, { "Panasonic DMC-GF1", 15, 0xf92, From 0d60258a96c5e98e1a4223102e0bcb2fe831b577 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Sat, 30 Mar 2024 21:10:04 +0100 Subject: [PATCH 28/78] dcraw: add Panasonic DC-GH6 to adobe_coeffs --- rtengine/dcraw.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 56d400d3d..d96012094 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -8919,6 +8919,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6929,-2355,-708,-4192,12534,1828,-1097,1989,5195 } }, { "Panasonic DC-GH5", 15, 0, { 7641,-2336,-605,-3218,11299,2187,-485,1338,5121 } }, + { "Panasonic DC-GH6", 0, 0, + { 7949,-3491,-710,-3435,11681,1977,-503,1622,5065 } }, { "Panasonic DMC-GM1", 15, 0, { 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 } }, { "Panasonic DMC-GM5", 15, 0, From eb3b49eff73d786202a5dd46956787734e3fd674 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Mon, 13 May 2024 14:12:30 +0200 Subject: [PATCH 29/78] dcraw: add 12 bit raw handling to panasonic v6 decoder. Port panasonic v6 decoder handling of 12 bit raw from libraw. --- rtengine/panasonic_decoders.cc | 67 ++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/rtengine/panasonic_decoders.cc b/rtengine/panasonic_decoders.cc index bbbfb7c20..62bac4526 100644 --- a/rtengine/panasonic_decoders.cc +++ b/rtengine/panasonic_decoders.cc @@ -60,7 +60,7 @@ unsigned DCraw::pana_bits_t::operator() (int nbits, unsigned *bytes) class pana_cs6_page_decoder { - unsigned int pixelbuffer[14], lastoffset, maxoffset; + unsigned int pixelbuffer[18], lastoffset, maxoffset; unsigned char current, *buffer; public: pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize) @@ -68,10 +68,15 @@ public: { } void read_page(); // will throw IO error if not enough space in buffer + void read_page12(); // 12-bit variant unsigned int nextpixel() { return current < 14 ? pixelbuffer[current++] : 0; } + unsigned int nextpixel12() + { + return current < 18 ? pixelbuffer[current++] : 0; + } }; #define wbuffer(i) ((unsigned short)buffer[lastoffset + 15 - i]) @@ -97,6 +102,37 @@ void pana_cs6_page_decoder::read_page() current = 0; lastoffset += 16; } + +void pana_cs6_page_decoder::read_page12() +{ + if (!buffer || (maxoffset - lastoffset < 16)) + ; + pixelbuffer[0] = (wbuffer(0) << 4) | (wbuffer(1) >> 4); // 12 bit: 8/0 + 4 upper bits of /1 + pixelbuffer[1] = (((wbuffer(1) & 0xf) << 8) | (wbuffer(2))) & 0xfff; // 12 bit: 4l/1 + 8/2 + + pixelbuffer[2] = (wbuffer(3) >> 6) & 0x3; // 2; 2u/3, 6 low bits remains in wbuffer(3) + pixelbuffer[3] = ((wbuffer(3) & 0x3f) << 2) | (wbuffer(4) >> 6); // 8; 6l/3 + 2u/4; 6 low bits remains in wbuffer(4) + pixelbuffer[4] = ((wbuffer(4) & 0x3f) << 2) | (wbuffer(5) >> 6); // 8: 6l/4 + 2u/5; 6 low bits remains in wbuffer(5) + pixelbuffer[5] = ((wbuffer(5) & 0x3f) << 2) | (wbuffer(6) >> 6); // 8: 6l/5 + 2u/6, 6 low bits remains in wbuffer(6) + + pixelbuffer[6] = (wbuffer(6) >> 4) & 0x3; // 2, 4 low bits remains in wbuffer(6) + pixelbuffer[7] = ((wbuffer(6) & 0xf) << 4) | (wbuffer(7) >> 4); // 8: 4 low bits from wbuffer(6), 4 upper bits from wbuffer(7) + pixelbuffer[8] = ((wbuffer(7) & 0xf) << 4) | (wbuffer(8) >> 4); // 8: 4 low bits from wbuffer(7), 4 upper bits from wbuffer(8) + pixelbuffer[9] = ((wbuffer(8) & 0xf) << 4) | (wbuffer(9) >> 4); // 8: 4 low bits from wbuffer(8), 4 upper bits from wbuffer(9) + + pixelbuffer[10] = (wbuffer(9) >> 2) & 0x3; // 2: bits 2-3 from wbuffer(9), two low bits remain in wbuffer(9) + pixelbuffer[11] = ((wbuffer(9) & 0x3) << 6) | (wbuffer(10) >> 2); // 8: 2 bits from wbuffer(9), 6 bits from wbuffer(10) + pixelbuffer[12] = ((wbuffer(10) & 0x3) << 6) | (wbuffer(11) >> 2); // 8: 2 bits from wbuffer(10), 6 bits from wbuffer(11) + pixelbuffer[13] = ((wbuffer(11) & 0x3) << 6) | (wbuffer(12) >> 2); // 8: 2 bits from wbuffer(11), 6 bits from wbuffer(12) + + pixelbuffer[14] = wbuffer(12) & 0x3; // 2: low bits from wbuffer(12) + pixelbuffer[15] = wbuffer(13); + pixelbuffer[16] = wbuffer(14); + pixelbuffer[17] = wbuffer(15); + current = 0; + lastoffset += 16; +} + #undef wbuffer void DCraw::panasonic_load_raw() @@ -176,8 +212,14 @@ void DCraw::panasonic_load_raw() void DCraw::panasonicC6_load_raw() { constexpr int rowstep = 16; - const int blocksperrow = raw_width / 11; + const bool _12bit = RT_pana_info.bpp == 12; + const int pixperblock = _12bit ? 14 : 11; + const int blocksperrow = raw_width / pixperblock; const int rowbytes = blocksperrow * 16; + const unsigned pixelbase0 = _12bit ? 0x80 : 0x200; + const unsigned pixelbase_compare = _12bit ? 0x800 : 0x2000; + const unsigned spix_compare = _12bit ? 0x3fff : 0xffff; + const unsigned pixel_mask = _12bit ? 0xfff : 0x3fff; unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); merror(iobuf, "panasonicC6_load_raw()"); @@ -188,25 +230,28 @@ void DCraw::panasonicC6_load_raw() for (int crow = 0, col = 0; crow < rowstoread; ++crow, col = 0) { unsigned short *rowptr = &raw_image[(row + crow) * raw_width]; for (int rblock = 0; rblock < blocksperrow; rblock++) { - page.read_page(); + if (_12bit) + page.read_page12(); + else + page.read_page(); unsigned oddeven[2] = {0, 0}, nonzero[2] = {0, 0}; unsigned pmul = 0, pixel_base = 0; - for (int pix = 0; pix < 11; ++pix) { + for (int pix = 0; pix < pixperblock; ++pix) { if (pix % 3 == 2) { - unsigned base = page.nextpixel(); + unsigned base = _12bit ? page.nextpixel12(): page.nextpixel(); if (base > 3) { derror(); } if (base == 3) { base = 4; } - pixel_base = 0x200 << base; + pixel_base = pixelbase0 << base; pmul = 1 << base; } - unsigned epixel = page.nextpixel(); + unsigned epixel = _12bit ? page.nextpixel12() : page.nextpixel(); if (oddeven[pix % 2]) { epixel *= pmul; - if (pixel_base < 0x2000 && nonzero[pix % 2] > pixel_base) { + if (pixel_base < pixelbase_compare && nonzero[pix % 2] > pixel_base) { epixel += nonzero[pix % 2] - pixel_base; } nonzero[pix % 2] = epixel; @@ -219,11 +264,11 @@ void DCraw::panasonicC6_load_raw() } } const unsigned spix = epixel - 0xf; - if (spix <= 0xffff) { - rowptr[col++] = spix & 0xffff; + if (spix <= spix_compare) { + rowptr[col++] = spix & spix_compare; } else { epixel = (((signed int)(epixel + 0x7ffffff1)) >> 0x1f); - rowptr[col++] = epixel & 0x3fff; + rowptr[col++] = epixel & pixel_mask; } } } From 6b14cf114b1f1b501ec489307357646cf99d3f32 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Mon, 13 May 2024 14:23:23 +0200 Subject: [PATCH 30/78] dcraw: add Panasonic DC-GH5M2 to adobe_coeffs --- rtengine/dcraw.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 56d400d3d..254af14ad 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -8917,6 +8917,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-GH5M2", 0, 0, + { 9300,-3659,-755,-2981,10988,2287,-190,1077,5016 } }, { "Panasonic DC-GH5", 15, 0, { 7641,-2336,-605,-3218,11299,2187,-485,1338,5121 } }, { "Panasonic DMC-GM1", 15, 0, From 106ade3d8d5c4ba1a0d0fe231cbefa7f0024d684 Mon Sep 17 00:00:00 2001 From: xiota Date: Sat, 25 May 2024 06:49:09 +0000 Subject: [PATCH 31/78] Fix version for libjxl API change --- rtengine/imageio.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 44297b10f..22f796e7d 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -898,7 +898,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) std::size_t icc_size = 0; if (JXL_DEC_SUCCESS != -#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 9, 0) JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) #else JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) @@ -911,7 +911,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) icc_profile.resize(icc_size); if (JXL_DEC_SUCCESS != -#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 9, 0) JxlDecoderGetColorAsICCProfile( dec.get(), &format, _PROFILE_, icc_profile.data(), icc_profile.size()) From a5954ad4c238c7fc801700f6b6a3e75959f0913b Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 26 May 2024 11:11:07 +0000 Subject: [PATCH 32/78] Switch g_printerr to std::cerr --- rtengine/imageio.cc | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 22f796e7d..8ecadd46c 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -852,7 +852,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) std::vector const compressed = getFileData(fname); if (compressed.empty()) { - g_printerr("Error: loadJXL failed to get data from file\n"); + std::cerr << "Error: loadJXL failed to get data from file" << std::endl; return IMIO_READERROR; } @@ -865,14 +865,14 @@ int ImageIO::loadJXL(const Glib::ustring &fname) JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | JXL_DEC_COLOR_ENCODING | JXL_DEC_FULL_IMAGE)) { - g_printerr("Error: JxlDecoderSubscribeEvents failed\n"); + std::cerr << "Error: JxlDecoderSubscribeEvents failed" << std::endl; return IMIO_HEADERERROR; } if (JXL_DEC_SUCCESS != JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, runner.get())) { - g_printerr("Error: JxlDecoderSetParallelRunner failed\n"); + std::cerr << "Error: JxlDecoderSetParallelRunner failed" << std::endl; return IMIO_HEADERERROR; } @@ -884,7 +884,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) if (status == JXL_DEC_BASIC_INFO) { if (JXL_DEC_SUCCESS != JxlDecoderGetBasicInfo(dec.get(), &info)) { - g_printerr("Error: JxlDecoderGetBasicInfo failed\n"); + std::cerr << "Error: JxlDecoderGetBasicInfo failed" << std::endl; return IMIO_HEADERERROR; } @@ -904,7 +904,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) #endif ) { - g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); + std::cerr << "Warning: JxlDecoderGetICCProfileSize failed" << std::endl; } if (icc_size > 0) { @@ -921,14 +921,13 @@ int ImageIO::loadJXL(const Glib::ustring &fname) icc_profile.data(), icc_profile.size()) #endif ) { - g_printerr( - "Warning: JxlDecoderGetColorAsICCProfile failed\n"); + std::cerr << "Warning: JxlDecoderGetColorAsICCProfile failed" << std::endl; } else { embProfile = cmsOpenProfileFromMem(icc_profile.data(), icc_profile.size()); } } else { - g_printerr("Warning: Empty ICC data.\n"); + std::cerr << "Warning: Empty ICC data." << std::endl; } } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { // Note: If assert is triggered, change to assignment. @@ -938,14 +937,14 @@ int ImageIO::loadJXL(const Glib::ustring &fname) if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize(dec.get(), &format, &buffer_size)) { - g_printerr("Error: JxlDecoderImageOutBufferSize failed\n"); + std::cerr << "Error: JxlDecoderImageOutBufferSize failed" << std::endl; return IMIO_READERROR; } buffer.resize(buffer_size); if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer.data(), buffer.size())) { - g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); + std::cerr << "Error: JxlDecoderSetImageOutBuffer failed" << std::endl; return IMIO_READERROR; } } else if (status == JXL_DEC_FULL_IMAGE || @@ -957,13 +956,13 @@ int ImageIO::loadJXL(const Glib::ustring &fname) // Decoding complete. Decoder will be released automatically. break; } else if (status == JXL_DEC_NEED_MORE_INPUT) { - g_printerr("Error: Decoder needs more input data\n"); + std::cerr << "Error: Decoder needs more input data" << std::endl; return IMIO_READERROR; } else if (status == JXL_DEC_ERROR) { - g_printerr("Error: Decoder error\n"); + std::cerr << "Error: Decoder error" << std::endl; return IMIO_READERROR; } else { - g_printerr("Error: Unknown decoder status\n"); + std::cerr << "Error: Unknown decoder status" << std::endl; return IMIO_READERROR; } } // end grand decode loop From 40f9eefabecc78342155d228f5abf87b80544fe9 Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 26 May 2024 11:23:41 +0000 Subject: [PATCH 33/78] Add libjxl version to AboutThisBuild.txt --- AboutThisBuild.txt.in | 1 + CMakeLists.txt | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index 4d8f4f3fe..065b6c6cc 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -8,6 +8,7 @@ System: ${SYSTEM} Bit depth: ${PROC_BIT_DEPTH} Gtkmm: V${GTKMM_VERSION} Lensfun: V${LENSFUN_VERSION} +libjxl: V${JXL_VERSION} Build type: ${BUILD_TYPE} Build flags: ${CXX_FLAGS} Link flags: ${LFLAGS} diff --git a/CMakeLists.txt b/CMakeLists.txt index fe7884ee9..b6c053dd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -560,14 +560,19 @@ if(WITH_JXL AND NOT WITH_JXL STREQUAL "AUTO") else() set(JXL_REQUIRED "") endif() -pkg_check_modules(JXL ${JXL_REQUIRED} IMPORTED_TARGET libjxl libjxl_threads) +pkg_check_modules(JXL ${JXL_REQUIRED} IMPORTED_TARGET libjxl) +pkg_check_modules(JXLTHREADS ${JXL_REQUIRED} IMPORTED_TARGET libjxl_threads) if(JXL_FOUND) if(WITH_JXL OR WITH_JXL STREQUAL "AUTO") add_definitions(-DLIBJXL) + list(APPEND JXL_INCLUDE_DIRS ${JXLTHREADS_INCLUDE_DIRS}) + list(APPEND JXL_LIBRARIES ${JXLTHREADS_LIBRARIES}) else() message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") set(JXL_INCLUDE_DIRS "") set(JXL_LIBRARIES "") + set(JXLTHREADS_INCLUDE_DIRS "") + set(JXLTHREADS_LIBRARIES "") endif() endif() @@ -751,6 +756,7 @@ if(NOT APPLE) -DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DOPTION_OMP:STRING=${OPTION_OMP} -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} + -DJXL_VERSION:STRING=${JXL_VERSION} -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION}) endif() @@ -780,6 +786,7 @@ elseif(APPLE) -DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DOPTION_OMP:STRING=${OPTION_OMP} -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} + -DJXL_VERSION:STRING=${JXL_VERSION} -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION} -P ${PROJECT_SOURCE_DIR}/UpdateInfo.cmake) else() From e81724645221e97b57e88053060fb268fddad2d5 Mon Sep 17 00:00:00 2001 From: xiota Date: Mon, 27 May 2024 21:01:59 +0000 Subject: [PATCH 34/78] AboutThisBuild: Distinguish JXL unavailable and disabled --- AboutThisBuild.txt.in | 6 +++--- CMakeLists.txt | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index 065b6c6cc..7c42f244e 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -6,9 +6,9 @@ Compiler: ${COMPILER_INFO} Processor: ${PROC_LABEL} System: ${SYSTEM} Bit depth: ${PROC_BIT_DEPTH} -Gtkmm: V${GTKMM_VERSION} -Lensfun: V${LENSFUN_VERSION} -libjxl: V${JXL_VERSION} +Gtkmm: ${GTKMM_VERSION} +Lensfun: ${LENSFUN_VERSION} +libjxl: ${JXL_VERSION} Build type: ${BUILD_TYPE} Build flags: ${CXX_FLAGS} Link flags: ${LFLAGS} diff --git a/CMakeLists.txt b/CMakeLists.txt index b6c053dd0..18b4ef04f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -569,11 +569,14 @@ if(JXL_FOUND) list(APPEND JXL_LIBRARIES ${JXLTHREADS_LIBRARIES}) else() message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") + set(JXL_VERSION "Disabled") set(JXL_INCLUDE_DIRS "") set(JXL_LIBRARIES "") set(JXLTHREADS_INCLUDE_DIRS "") set(JXLTHREADS_LIBRARIES "") endif() +else() + set(JXL_VERSION "Not installed") endif() # Check for libcanberra-gtk3 (sound events on Linux): From 5ea3a4b979da6af5ccf42f2840cccee91be0630e Mon Sep 17 00:00:00 2001 From: xiota Date: Tue, 28 May 2024 06:45:49 +0000 Subject: [PATCH 35/78] AboutThisBuild: Make libjxl status strings less confusing --- CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 18b4ef04f..7696270ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -569,14 +569,16 @@ if(JXL_FOUND) list(APPEND JXL_LIBRARIES ${JXLTHREADS_LIBRARIES}) else() message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") - set(JXL_VERSION "Disabled") + string(APPEND JXL_VERSION " - Disabled") set(JXL_INCLUDE_DIRS "") set(JXL_LIBRARIES "") set(JXLTHREADS_INCLUDE_DIRS "") set(JXLTHREADS_LIBRARIES "") endif() +elseif(WITH_JXL STREQUAL "AUTO") + set(JXL_VERSION "Disabled, Auto") else() - set(JXL_VERSION "Not installed") + set(JXL_VERSION "Disabled") endif() # Check for libcanberra-gtk3 (sound events on Linux): From d2af04cea27ba951927ca6bbe704941e30f9a189 Mon Sep 17 00:00:00 2001 From: xiota Date: Tue, 28 May 2024 07:18:51 +0000 Subject: [PATCH 36/78] Add "Loading JXL" translations --- rtdata/languages/Catala | 1 + rtdata/languages/Chinese (Simplified) | 1 + rtdata/languages/Czech | 1 + rtdata/languages/Dansk | 1 + rtdata/languages/Deutsch | 1 + rtdata/languages/English (UK) | 1 + rtdata/languages/English (US) | 1 + rtdata/languages/Espanol (Castellano) | 1 + rtdata/languages/Espanol (Latin America) | 1 + rtdata/languages/Francais | 1 + rtdata/languages/Italiano | 1 + rtdata/languages/Japanese | 1 + rtdata/languages/Magyar | 1 + rtdata/languages/Nederlands | 1 + rtdata/languages/Polish | 1 + rtdata/languages/Portugues | 1 + rtdata/languages/Portugues (Brasil) | 1 + rtdata/languages/Russian | 1 + rtdata/languages/Serbian (Cyrilic Characters) | 1 + rtdata/languages/Slovenian | 1 + rtdata/languages/Swedish | 1 + rtdata/languages/default | 1 + 22 files changed, 22 insertions(+) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 03353cdb7..bc95d7546 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -555,6 +555,7 @@ PROFILEPANEL_TOOLTIPSAVE;Desa l'actual com a perfil.\nCtrl-click per sele PROGRESSBAR_LOADING;Carregant imatge... PROGRESSBAR_LOADINGTHUMBS;Carregant minifotos... PROGRESSBAR_LOADJPEG;Carregant fitxer JPEG... +PROGRESSBAR_LOADJXL;Carregant fitxer JXL... PROGRESSBAR_LOADPNG;Carregant fitxer PNG... PROGRESSBAR_LOADTIFF;Carregant fitxer TIFF... PROGRESSBAR_PROCESSING;Processant imatge... diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index f18513c15..2999c0c77 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1241,6 +1241,7 @@ PROGRESSBAR_LINEDENOISE;线状噪点过滤... PROGRESSBAR_LOADING;图片加载中... PROGRESSBAR_LOADINGTHUMBS;读取缩略图... PROGRESSBAR_LOADJPEG;JPEG文件加载中... +PROGRESSBAR_LOADJXL;JXL文件加载中... PROGRESSBAR_LOADPNG;PNG文件加载中... PROGRESSBAR_LOADTIFF;TIFF文件加载中... PROGRESSBAR_NOIMAGES;未找到图片 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 232c094e0..995f089db 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -1306,6 +1306,7 @@ PROGRESSBAR_LINEDENOISE;Filtr linkového rušení… PROGRESSBAR_LOADING;Načítání obrázku... PROGRESSBAR_LOADINGTHUMBS;Načítání náhledů... PROGRESSBAR_LOADJPEG;Načítání JPEG... +PROGRESSBAR_LOADJXL;Načítání JXL... PROGRESSBAR_LOADPNG;Načítání PNG... PROGRESSBAR_LOADTIFF;Načítání TIFF... PROGRESSBAR_NOIMAGES;Složka neobsahuje obrázky diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index ed2e32616..e42f0bc83 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -1224,6 +1224,7 @@ PROGRESSBAR_LINEDENOISE;Linje støjfilter... PROGRESSBAR_LOADING;Indlæser billede... PROGRESSBAR_LOADINGTHUMBS;Indlæser thumbnails... PROGRESSBAR_LOADJPEG; Indlæser JPEG fil... +PROGRESSBAR_LOADJXL; Indlæser JXL fil... PROGRESSBAR_LOADPNG; Indlæser PNG fil... PROGRESSBAR_LOADTIFF;Indlæser TIFF fil... PROGRESSBAR_NOIMAGES;Ingen billeder fundet diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 84c52d64f..677efd8e0 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2147,6 +2147,7 @@ PROGRESSBAR_LINEDENOISE;Linienrauschfilter... PROGRESSBAR_LOADING;Lade Bild... PROGRESSBAR_LOADINGTHUMBS;Lade Miniaturbilder... PROGRESSBAR_LOADJPEG;Lade JPEG... +PROGRESSBAR_LOADJXL;Lade JXL... PROGRESSBAR_LOADPNG;Lade PNG... PROGRESSBAR_LOADTIFF;Lade TIFF... PROGRESSBAR_NOIMAGES;Keine Bilder gefunden diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index f03dbd1af..37ccdc48f 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -2259,6 +2259,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PROGRESSBAR_LOADING;Loading image... !PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... !PROGRESSBAR_LOADJPEG;Loading JPEG file... +!PROGRESSBAR_LOADJXL;Loading JXL file... !PROGRESSBAR_LOADPNG;Loading PNG file... !PROGRESSBAR_LOADTIFF;Loading TIFF file... !PROGRESSBAR_NOIMAGES;No images found diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 329925625..079713ac1 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -2082,6 +2082,7 @@ !PROGRESSBAR_LOADING;Loading image... !PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... !PROGRESSBAR_LOADJPEG;Loading JPEG file... +!PROGRESSBAR_LOADJXL;Loading JXL file... !PROGRESSBAR_LOADPNG;Loading PNG file... !PROGRESSBAR_LOADTIFF;Loading TIFF file... !PROGRESSBAR_NOIMAGES;No images found diff --git a/rtdata/languages/Espanol (Castellano) b/rtdata/languages/Espanol (Castellano) index 32b5791dc..9f9cc48bf 100644 --- a/rtdata/languages/Espanol (Castellano) +++ b/rtdata/languages/Espanol (Castellano) @@ -2006,6 +2006,7 @@ PROGRESSBAR_LINEDENOISE;Filtro de ruido de línea... PROGRESSBAR_LOADING;Cargando imagen... PROGRESSBAR_LOADINGTHUMBS;Cargando miniaturas... PROGRESSBAR_LOADJPEG;Cargando archivo JPEG... +PROGRESSBAR_LOADJXL;Cargando archivo JXL... PROGRESSBAR_LOADPNG;Cargando archivo PNG... PROGRESSBAR_LOADTIFF;Cargando archivo TIFF... PROGRESSBAR_NOIMAGES;No se encuentran imágenes diff --git a/rtdata/languages/Espanol (Latin America) b/rtdata/languages/Espanol (Latin America) index 9d5e352bd..816b237c6 100644 --- a/rtdata/languages/Espanol (Latin America) +++ b/rtdata/languages/Espanol (Latin America) @@ -1253,6 +1253,7 @@ PROFILEPANEL_TOOLTIPSAVE;Guardar perfil actual.\nCtrl-click para seleccio PROGRESSBAR_LOADING;Abriendo imagen... PROGRESSBAR_LOADINGTHUMBS;Cargando miniaturas... PROGRESSBAR_LOADJPEG;Abriendo archivo JPEG... +PROGRESSBAR_LOADJXL;Abriendo archivo JXL... PROGRESSBAR_LOADPNG;Abriendo archivo PNG... PROGRESSBAR_LOADTIFF;Abriendo archivo TIFF... PROGRESSBAR_NOIMAGES;No se han encontrado imágenes diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 33ffc861c..53e478f78 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1210,6 +1210,7 @@ PROFILEPANEL_TOOLTIPSAVE;Enregistrer le profil actuel\nCTRL-clic pour sé PROGRESSBAR_LOADING;Chargement de l'Image... PROGRESSBAR_LOADINGTHUMBS;Chargement des vignettes... PROGRESSBAR_LOADJPEG;Chargement du fichier JPEG... +PROGRESSBAR_LOADJXL;Chargement du fichier JXL... PROGRESSBAR_LOADPNG;Chargement du fichier PNG... PROGRESSBAR_LOADTIFF;Chargement du fichier TIFF... PROGRESSBAR_NOIMAGES;Pas d'image trouvée diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 5ef63de7b..8e1f6124d 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -2088,6 +2088,7 @@ PROGRESSBAR_LINEDENOISE;Filtro antirumore di linea... PROGRESSBAR_LOADING;Caricamento immagine... PROGRESSBAR_LOADINGTHUMBS;Caricamento miniature... PROGRESSBAR_LOADJPEG;Caricamento JPEG... +PROGRESSBAR_LOADJXL;Caricamento JXL... PROGRESSBAR_LOADPNG;Caricamento PNG... PROGRESSBAR_LOADTIFF;Caricamento TIFF... PROGRESSBAR_NOIMAGES;Nessuna immagine trovata diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 8bfbf0f42..290e42b57 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -2005,6 +2005,7 @@ PROGRESSBAR_LINEDENOISE;ラインノイズフィルタ。。。 PROGRESSBAR_LOADING;画像読み込み中... PROGRESSBAR_LOADINGTHUMBS;サムネイルの読み込み... PROGRESSBAR_LOADJPEG;JPEGファイル読み込み中... +PROGRESSBAR_LOADJXL;JXLファイル読み込み中... PROGRESSBAR_LOADPNG;PNGファイル読み込み中... PROGRESSBAR_LOADTIFF;TIFFファイル読み込み中... PROGRESSBAR_NOIMAGES;画像が見つかりません diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 07ab9784b..8336efda8 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1084,6 +1084,7 @@ PROGRESSBAR_LINEDENOISE;Sorzajszűrő... PROGRESSBAR_LOADING;Kép betöltése... PROGRESSBAR_LOADINGTHUMBS;Előnézeti képek betöltése... PROGRESSBAR_LOADJPEG;JPEG fájl betöltése... +PROGRESSBAR_LOADJXL;JXL fájl betöltése... PROGRESSBAR_LOADPNG;PNG fájl betöltése... PROGRESSBAR_LOADTIFF;TIFF fájl betöltése... PROGRESSBAR_NOIMAGES;Nem találhatóak képek diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index a0418e70c..af2862781 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -1242,6 +1242,7 @@ PROGRESSBAR_LINEDENOISE;Lijnruisfilter... PROGRESSBAR_LOADING;Afbeelding laden... PROGRESSBAR_LOADINGTHUMBS;Miniaturen laden... PROGRESSBAR_LOADJPEG;Laden JPEG-bestand... +PROGRESSBAR_LOADJXL;Laden JXL-bestand... PROGRESSBAR_LOADPNG;Laden PNG-bestand... PROGRESSBAR_LOADTIFF;Laden TIFF-bestand... PROGRESSBAR_NOIMAGES;Geen afbeeldingen diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 94df4424f..7ad5c1792 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1192,6 +1192,7 @@ PROGRESSBAR_LINEDENOISE;Liniowy filtr szumu... PROGRESSBAR_LOADING;Wczytywanie obrazu... PROGRESSBAR_LOADINGTHUMBS;Wczytywanie miniatur... PROGRESSBAR_LOADJPEG;Ładowanie pliku JPEG... +PROGRESSBAR_LOADJXL;Ładowanie pliku JXL... PROGRESSBAR_LOADPNG;Ładowanie pliku PNG... PROGRESSBAR_LOADTIFF;Ładowanie pliku TIFF... PROGRESSBAR_NOIMAGES;Nie znaleziono żadnych obrazów diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index 77ffcaf40..e037c565c 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -1197,6 +1197,7 @@ PROFILEPANEL_TOOLTIPSAVE;Guardar o perfil atual.\nCtrl-click para selecio PROGRESSBAR_LOADING;A carregar a imagem... PROGRESSBAR_LOADINGTHUMBS;A carregar as miniaturas... PROGRESSBAR_LOADJPEG;A carregar o ficheiro JPEG... +PROGRESSBAR_LOADJXL;A carregar o ficheiro JXL... PROGRESSBAR_LOADPNG;A carregar o ficheiro PNG... PROGRESSBAR_LOADTIFF;A carregar o ficheiro TIFF... PROGRESSBAR_NOIMAGES;Não foi encontrada nenhuma imagem diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index c22207212..133205a09 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -1207,6 +1207,7 @@ PROGRESSBAR_LINEDENOISE;Filtro de ruído de linha... PROGRESSBAR_LOADING;Carregando imagem... PROGRESSBAR_LOADINGTHUMBS;Carregando miniaturas... PROGRESSBAR_LOADJPEG;Carregando arquivo JPEG... +PROGRESSBAR_LOADJXL;Carregando arquivo JXL... PROGRESSBAR_LOADPNG;Carregando arquivo PNG... PROGRESSBAR_LOADTIFF;Carregando arquivo TIFF... PROGRESSBAR_NOIMAGES;Nenhuma imagem encontrada diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 74a08f2d3..de0846e01 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -843,6 +843,7 @@ PROFILEPANEL_TOOLTIPSAVE;Сохранить текущий профиль\nCt PROGRESSBAR_LOADING;Загрузка изображения... PROGRESSBAR_LOADINGTHUMBS;Загрузка миниатюр... PROGRESSBAR_LOADJPEG;Чтение JPEG файла... +PROGRESSBAR_LOADJXL;Чтение JXL файла... PROGRESSBAR_LOADPNG;Чтение PNG файла... PROGRESSBAR_LOADTIFF;Чтение TIFF файла... PROGRESSBAR_NOIMAGES;Изображения не найдены diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 1cf1086bf..15bb90737 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -670,6 +670,7 @@ PROFILEPANEL_TOOLTIPSAVE;Чува тренутни профил PROGRESSBAR_LOADING;Учитавам слику... PROGRESSBAR_LOADINGTHUMBS;Учитавам приказе... PROGRESSBAR_LOADJPEG;Учитавам JPEG датотеку... +PROGRESSBAR_LOADJPEG;Учитавам JXL датотеку... PROGRESSBAR_LOADPNG;Учитавам PNG датотеку... PROGRESSBAR_LOADTIFF;Учитавам TIFF датотеку... PROGRESSBAR_NOIMAGES;Нису пронађене слике diff --git a/rtdata/languages/Slovenian b/rtdata/languages/Slovenian index 84ea9e72e..1ba151693 100644 --- a/rtdata/languages/Slovenian +++ b/rtdata/languages/Slovenian @@ -1221,6 +1221,7 @@ PROGRESSBAR_LINEDENOISE;Filter linijskega šuma... PROGRESSBAR_LOADING;Nalagam sliko... PROGRESSBAR_LOADINGTHUMBS;Nalagam predogledne sličice... PROGRESSBAR_LOADJPEG;Nalagam datoteko JPEG... +PROGRESSBAR_LOADJXL;Nalagam datoteko JXL... PROGRESSBAR_LOADPNG;Nalagam datoteko PNG... PROGRESSBAR_LOADTIFF;Nalagam datoteko TIFF... PROGRESSBAR_NOIMAGES;Ne najdem nobene slike diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 0ff9f831f..edbeb9e3a 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -911,6 +911,7 @@ PROFILEPANEL_TOOLTIPSAVE;Spara nuvarande profil.\nCtrl-klicka för att v PROGRESSBAR_LOADING;Laddar bild... PROGRESSBAR_LOADINGTHUMBS;Laddar miniatyrbilder... PROGRESSBAR_LOADJPEG;Laddar JPEG-fil... +PROGRESSBAR_LOADJXL;Laddar JXL-fil... PROGRESSBAR_LOADPNG;Laddar PNG-fil... PROGRESSBAR_LOADTIFF;Laddar TIFF-fil... PROGRESSBAR_NOIMAGES;Inga bilder funna. diff --git a/rtdata/languages/default b/rtdata/languages/default index a6a8cdc5c..252564758 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2086,6 +2086,7 @@ PROGRESSBAR_LINEDENOISE;Line noise filter... PROGRESSBAR_LOADING;Loading image... PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... PROGRESSBAR_LOADJPEG;Loading JPEG file... +PROGRESSBAR_LOADJXL;Loading JXL file... PROGRESSBAR_LOADPNG;Loading PNG file... PROGRESSBAR_LOADTIFF;Loading TIFF file... PROGRESSBAR_NOIMAGES;No images found From 13804545781ec39b755a7c184dc9cc711fd38485 Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Wed, 29 May 2024 18:19:43 -0700 Subject: [PATCH 37/78] Update Japanese translation Provided by Yz2house in #7083. --- rtdata/languages/Japanese | 951 ++++++++++++++++++++++---------------- 1 file changed, 554 insertions(+), 397 deletions(-) diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 8bfbf0f42..4d5562bfe 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1,4 +1,5 @@ -#001 Last update 10-12-2022 +#001 2022-10-12 Yz2house +#002 2024-05-23 Yz2house #100 #101 @LANGUAGE_DISPLAY_NAME=日本語 @@ -52,6 +53,7 @@ DYNPROFILEEDITOR_PROFILE;処理プロファイル EDITWINDOW_TITLE;画像編集 EDIT_OBJECT_TOOLTIP;この機能を使うための目安に、プレビュー画面にガイドを表示する EDIT_PIPETTE_TOOLTIP;カーブ上に調整ポイントを追加するには、Ctrlキーを押しながら、プレビューの画像上の目標ポイントを左クリックします。\n追加されたそのポイントを調整するには、Ctrlキーを押しながら、プレビュー画像のそのポイントに当たる部分を左クリックします。それからCtrlキーを離し(微妙な調整をする場合はそのまま)、左クリックしたままマウスを画面上で上下に動かすと、それに合わせてトーンカーブが調整されます。 +ERROR_MSG_METADATA_VALUE;メタデータ: エラー設定 %1から%2 EXIFFILTER_APERTURE;絞り EXIFFILTER_CAMERA;カメラ EXIFFILTER_EXPOSURECOMPENSATION;露光量補正 (EV) @@ -61,12 +63,16 @@ EXIFFILTER_IMAGETYPE;画像の種類 EXIFFILTER_ISO;ISO EXIFFILTER_LENS;レンズ EXIFFILTER_METADATAFILTER;メタデータ絞り込みを有効にする +EXIFFILTER_PATH;ファイルパス EXIFFILTER_SHUTTER;シャッター +EXIFPANEL_ACTIVATE_ALL_HINT;全てのタグを選択 +EXIFPANEL_ACTIVATE_NONE_HINT;何れのタグも選択しない EXIFPANEL_ADDEDIT;追加/編集 EXIFPANEL_ADDEDITHINT;新しいタグを追加、またはタグの編集 EXIFPANEL_ADDTAGDLG_ENTERVALUE;値の入力 EXIFPANEL_ADDTAGDLG_SELECTTAG;タグ選択 EXIFPANEL_ADDTAGDLG_TITLE;タグの追加/編集 +EXIFPANEL_BASIC_GROUP;ベーシック EXIFPANEL_KEEP;そのまま EXIFPANEL_KEEPHINT;出力ファイルに書き込む際、選択されたタグをそのままにする EXIFPANEL_REMOVE;削除 @@ -75,9 +81,8 @@ EXIFPANEL_RESET;リセット EXIFPANEL_RESETALL;すべてリセット EXIFPANEL_RESETALLHINT;すべてのタグを元の値にリセット EXIFPANEL_RESETHINT;選択されたタグを元の値にリセット -EXIFPANEL_SHOWALL;全て表示 -EXIFPANEL_SUBDIRECTORY;サブディレクトリ -EXPORT_BYPASS;迂回させる機能 +EXIFPANEL_VALUE_NOT_SHOWN;非表示 +EXPORT_BYPASS;処理工程を迂回 EXPORT_BYPASS_ALL;全て選択 / 全て解除 EXPORT_BYPASS_DEFRINGE;フリンジ低減を迂回 EXPORT_BYPASS_DIRPYRDENOISE;ノイズ低減を迂回 @@ -164,7 +169,8 @@ FILEBROWSER_POPUPRANK5;ランク 5 ***** FILEBROWSER_POPUPREMOVE;完全に削除 FILEBROWSER_POPUPREMOVEINCLPROC;キュー処理に保持されているファイルを含めて完全に削除 FILEBROWSER_POPUPRENAME;名前変更 -FILEBROWSER_POPUPSELECTALL;全選択 +FILEBROWSER_POPUPSELECTALL;全て選択 +FILEBROWSER_POPUPSORTBY;ファイルの並べ替え FILEBROWSER_POPUPTRASH;ゴミ箱へ移動 FILEBROWSER_POPUPUNRANK;ランクなし FILEBROWSER_POPUPUNTRASH;ゴミ箱から移動 @@ -196,11 +202,12 @@ FILEBROWSER_SHOWRANK2HINT;2つ星ランクを表示\nショートカット: Shift-3 FILEBROWSER_SHOWRANK4HINT;4つ星ランクを表示\nショートカット: Shift-4 FILEBROWSER_SHOWRANK5HINT;5つ星ランクを表示\nショートカット: Shift-5 -FILEBROWSER_SHOWRECENTLYSAVEDHINT;最近保存された画像を表示\nショートカット: Alt-7 -FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;最近保存されていない画像を表示\nショートカット: Alt-6 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;保存された画像を表示\nショートカット: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;保存されていない画像を表示\nショートカット: Alt-6 +FILEBROWSER_SHOWRECURSIVE;サブフォルダの中の画像を再帰的に表示 FILEBROWSER_SHOWTRASHHINT;ゴミ箱の内容を表示\nショートカット: Ctrl-t -FILEBROWSER_SHOWUNCOLORHINT;カラー・ラベルのない画像を表示\nショートカット: Alt-0 -FILEBROWSER_SHOWUNRANKHINT;ランクなし画像を表示\nショートカット: Shift-0 +FILEBROWSER_SHOWUNCOLORHINT;カラーラベルなしで画像を表示\nショートカット: Alt-0 +FILEBROWSER_SHOWUNRANKHINT;ランクのない画像を表示\nショートカット: Shift-0 FILEBROWSER_THUMBSIZE;サムネイルのサイズ FILEBROWSER_UNRANK_TOOLTIP;ランクなし\nショートカット: 0 FILEBROWSER_ZOOMINHINT;サムネイルサイズの拡大\nショートカット: +\n\nシングル編集タブのショートカット: Alt-+ @@ -208,6 +215,7 @@ FILEBROWSER_ZOOMOUTHINT;サムネイルサイズの縮小\nショートカット FILECHOOSER_FILTER_ANY;全てのファイル FILECHOOSER_FILTER_COLPROF;カラープロファイル FILECHOOSER_FILTER_CURVE;カーブファイル +FILECHOOSER_FILTER_EXECUTABLE;実行可能ファイル FILECHOOSER_FILTER_LCP;レンズ補正プロファイル FILECHOOSER_FILTER_PP;処理プロファイル FILECHOOSER_FILTER_SAME;現在の画像と同じフォーマット @@ -222,11 +230,11 @@ GENERAL_CANCEL;キャンセル GENERAL_CLOSE;閉じる GENERAL_CURRENT;現在 GENERAL_DELETE_ALL;全て削除 -GENERAL_DISABLE;無効 -GENERAL_DISABLED;無効 +GENERAL_DISABLE;無効にする +GENERAL_DISABLED;無効になりました GENERAL_EDIT;編集 -GENERAL_ENABLE;有効 -GENERAL_ENABLED;有効 +GENERAL_ENABLE;有効する +GENERAL_ENABLED;有効になりました GENERAL_FILE;ファイル GENERAL_HELP;ヘルプ GENERAL_LANDSCAPE;横 @@ -235,6 +243,7 @@ GENERAL_NO;No GENERAL_NONE;なし GENERAL_OK;OK GENERAL_OPEN;開く +GENERAL_OTHER;その他 GENERAL_PORTRAIT;縦 GENERAL_RESET;リセット GENERAL_SAVE;保存 @@ -735,21 +744,21 @@ HISTORY_MSG_496;ローカル スポット 削除 HISTORY_MSG_497;ローカル スポット 選択 HISTORY_MSG_498;ローカル スポット 名前 HISTORY_MSG_499;ローカル スポット 表示 -HISTORY_MSG_500;ローカル スポット 形状 -HISTORY_MSG_501;ローカル スポット 方法 -HISTORY_MSG_502;ローカル スポット 形状の方式 -HISTORY_MSG_503;ローカル スポット 右の垂直線 -HISTORY_MSG_504;ローカル スポット 左の垂直線 -HISTORY_MSG_505;ローカル スポット 下の水平線 -HISTORY_MSG_506;ローカル スポット 上の水平線 -HISTORY_MSG_507;ローカル スポット 中心 -HISTORY_MSG_508;ローカル スポット 大きさ -HISTORY_MSG_509;ローカル スポット 質の種類 -HISTORY_MSG_510;ローカル スポット 境界 -HISTORY_MSG_511;ローカル スポット しきい値 -HISTORY_MSG_512;ローカル スポット ΔEの減衰 -HISTORY_MSG_513;ローカル スポット スコープ -HISTORY_MSG_514;ローカル スポット 構造 +HISTORY_MSG_500;ローカル - スポット形状 +HISTORY_MSG_501;ローカル - スポット方法 +HISTORY_MSG_502;ローカル - SC -形状の方式 +HISTORY_MSG_503;ローカル - スポット - 右の垂直線 +HISTORY_MSG_504;ローカル - スポット - 左の垂直線 +HISTORY_MSG_505;ローカル - スポット - 下の水平線 +HISTORY_MSG_506;ローカル - スポット - 上の水平線 +HISTORY_MSG_507;ローカル - スポット - 中心 +HISTORY_MSG_508;ローカル - スポット - 大きさ +HISTORY_MSG_509;ローカル - スポット - 質の種類 +HISTORY_MSG_510;ローカル - TG - 変移の位置 +HISTORY_MSG_511;ローカル - SD - ΔEスコープのしきい値 +HISTORY_MSG_512;ローカル - SD - ΔEの減衰 +HISTORY_MSG_513;ローカル - スポット - 除外 - スコープ +HISTORY_MSG_514;ローカル - スポットの構造 HISTORY_MSG_515;ローカル編集 HISTORY_MSG_516;ローカル - 色と明るさ HISTORY_MSG_517;ローカル - 強力を有効にする @@ -856,7 +865,7 @@ HISTORY_MSG_618;ローカル - 色と明るさ マスクを使う HISTORY_MSG_619;ローカル - 露光補正 マスクを使う HISTORY_MSG_620;ローカル - 色と明るさ ぼかし HISTORY_MSG_621;ローカル - 露光補正 反対処理 -HISTORY_MSG_622;ローカル - 構造の除外 +HISTORY_MSG_622;ローカル - スポット - 除外 - スポットの構造 HISTORY_MSG_623;ローカル - 露光補正 色の補間 HISTORY_MSG_624;ローカル - カラー補正グリッド HISTORY_MSG_625;ローカル - 補正グリッドの強さ @@ -879,7 +888,7 @@ HISTORY_MSG_641;ローカル - シャドウハイライト マスクを使用 HISTORY_MSG_642;ローカル - シャドウハイライト 半径 HISTORY_MSG_643;ローカル - シャドウハイライト ぼかし HISTORY_MSG_644;ローカル - シャドウハイライト 反対処理 -HISTORY_MSG_645;ローカル - 色差のバランス ab-L +HISTORY_MSG_645;ローカル - SD - ab-Lのバランス HISTORY_MSG_646;ローカル - 露光補正 色度のマスク HISTORY_MSG_647;ローカル - 露光補正 ガンマのマスク HISTORY_MSG_648;ローカル - 露光補正 スロープのマスク @@ -893,7 +902,7 @@ HISTORY_MSG_655;ローカル - シャドウハイライト スロープのマ HISTORY_MSG_656;ローカル - 色と明るさ ソフトな半径 HISTORY_MSG_657;ローカル - レティネックス アーティファクトの軽減 HISTORY_MSG_658;ローカル - CbDL ソフトな半径 -HISTORY_MSG_659;ローカル スポット 境界値の減衰 +HISTORY_MSG_659;ローカル - TG - 変移の減衰 HISTORY_MSG_660;ローカル - CbDL 明瞭 HISTORY_MSG_661;ローカル - CbDL 残差のコントラスト HISTORY_MSG_662;ローカル - deNoise 輝度 細かい0 @@ -910,7 +919,7 @@ HISTORY_MSG_672;ローカル - CbDL マスク CL HISTORY_MSG_673;ローカル - CbDL マスクを使う HISTORY_MSG_674;ローカル - 削除された機能 HISTORY_MSG_675;ローカル - TM ソフトな半径 -HISTORY_MSG_676;ローカル スポット 境界の差異 +HISTORY_MSG_676;ローカル - TG - 変移の差異 HISTORY_MSG_677;ローカル - TM 量 HISTORY_MSG_678;ローカル - TM 彩度 HISTORY_MSG_679;ローカル - レティネックス マスク C @@ -1012,19 +1021,19 @@ HISTORY_MSG_780;ローカル - 色と明るさ シャドウのマスク HISTORY_MSG_781;ローカル - コントラスト ウェーブレットのレベルのマスク HISTORY_MSG_782;ローカル - Blur Denoise ウェーブレットのレベルのマスク HISTORY_MSG_783;ローカル - 色と明るさ ウェーブレットのレベル -HISTORY_MSG_784;ローカル - ΔEのマスク -HISTORY_MSG_785;ローカル - ΔEのスコープのマスク +HISTORY_MSG_784;ローカル - マスク - ΔE画像のマスク +HISTORY_MSG_785;ローカル - マスク - スコープ HISTORY_MSG_786;ローカル - シャドウハイライト 方式 HISTORY_MSG_787;ローカル - イコライザの乗数 HISTORY_MSG_788;ローカル - イコライザのディテール HISTORY_MSG_789;ローカル - シャドウハイライト マスクの量 HISTORY_MSG_790;ローカル - シャドウハイライト マスクのアンカー HISTORY_MSG_791;ローカル - マスク ショートLカーブ -HISTORY_MSG_792;ローカル - マスク 背景輝度 +HISTORY_MSG_792;ローカル - マスク - 背景 HISTORY_MSG_793;ローカル - シャドウハイライト TRCのガンマ HISTORY_MSG_794;ローカル - シャドウハイライト TRCのスロープ HISTORY_MSG_795;ローカル - マスク 復元したイメージの保存 -HISTORY_MSG_796;ローカル - 基準値の繰り返し +HISTORY_MSG_796;ローカル - SC - 繰り返しの基準 HISTORY_MSG_797;ローカル - オリジナルとの融合方式 HISTORY_MSG_798;ローカル - 不透明度 HISTORY_MSG_799;ローカル - Color RGB トーンカーブ @@ -1060,7 +1069,7 @@ HISTORY_MSG_829;ローカル - シャドウハイライト 階調 角度 HISTORY_MSG_830;ローカル - 色と明るさ 階調 Lの強さ HISTORY_MSG_831;ローカル - 色と明るさ 階調 角度 HISTORY_MSG_832;ローカル - 色と明るさ 階調 Cの強さ -HISTORY_MSG_833;ローカル - 減光のフェザー処理 +HISTORY_MSG_833;ローカル - TG - 減光のフェザー処理 HISTORY_MSG_834;ローカル - 色と明るさ 減光の強さ H HISTORY_MSG_835;ローカル - 自然な彩度 諧調 Lの強さ HISTORY_MSG_836;ローカル - 自然な彩度 階調 角度 @@ -1093,7 +1102,7 @@ HISTORY_MSG_863;ローカル - ウェーブレット 元画像と融合 HISTORY_MSG_864;ローカル - ウェーブレット 方向別コントラストの減衰 HISTORY_MSG_865;ローカル - ウェーブレット 方向別コントラスト Δ HISTORY_MSG_866;ローカル - ウェーブレット 方向別コントラスト 圧縮のガンマ -HISTORY_MSG_868;ローカル - ΔE C-Hのバランス +HISTORY_MSG_868;ローカル - SD - C-Hのバランス HISTORY_MSG_869;ローカル - レベルによるノイズ除去 HISTORY_MSG_870;ローカル - ウェーブレット マスク カーブH HISTORY_MSG_871;ローカル - ウェーブレット マスク カーブC @@ -1118,7 +1127,7 @@ HISTORY_MSG_890;ローカル - コントラスト ウェーブレット 階調 HISTORY_MSG_891;ローカル - コントラスト ウェーブレット 階調フィルタ HISTORY_MSG_892;ローカル - 対数符号化 階調の強さ HISTORY_MSG_893;ローカル - 対数符号化 階調の角度 -HISTORY_MSG_894;ローカル - 色と明るさ ΔEのプレビュー +HISTORY_MSG_894;ローカル - SD - ΔEプレビューの色の強さ HISTORY_MSG_897;ローカル - コントラスト ウェーブレット ES 強さ HISTORY_MSG_898;ローカル - コントラスト ウェーブレット ES 半径 HISTORY_MSG_899;ローカル - コントラスト ウェーブレット ES ディテール @@ -1132,7 +1141,7 @@ HISTORY_MSG_906;ローカル - コントラスト ウェーブレット ES 感 HISTORY_MSG_907;ローカル - コントラスト ウェーブレット ES 増幅 HISTORY_MSG_908;ローカル - コントラスト ウェーブレット ES 隣接 HISTORY_MSG_909;ローカル - コントラスト ウェーブレット ES 表示 -HISTORY_MSG_910;ローカル - ウェーブレット エッジ検出の効果 +HISTORY_MSG_910;ローカル - SC - ウェーブレット エッジ検出の効果 HISTORY_MSG_911;ローカル - ぼかし 色度 輝度 HISTORY_MSG_912;ローカル - ガイド付きフィルターの強さのぼかし HISTORY_MSG_913;ローカル - コントラスト ウェーブレット シグマ DR @@ -1144,10 +1153,10 @@ HISTORY_MSG_918;ローカル - ウェーブレットの残差画像 ハイライ HISTORY_MSG_919;ローカル - ウェーブレットの残差画像 ハイライトのしきい値 HISTORY_MSG_920;ローカル - ウェーブレット シグマ LC HISTORY_MSG_921;ローカル - ウェーブレット 階調のシグマ LC2 -HISTORY_MSG_922;ローカル - 白黒での変更 +HISTORY_MSG_922;ローカル - SC - 白黒での変更 HISTORY_MSG_923;ローカル - 機能の複雑度モード HISTORY_MSG_924;--未使用の文字列-- -HISTORY_MSG_925;ローカル - カラー機能のスコープ +HISTORY_MSG_925;ローカル - スコープ(カラー機能) HISTORY_MSG_926;ローカル - マスクのタイプを表示 HISTORY_MSG_927;ローカル - シャドウマスク HISTORY_MSG_928;ローカル - 共通のカラーマスク @@ -1206,7 +1215,7 @@ HISTORY_MSG_981;ローカル - 対数符号化 強さ HISTORY_MSG_982;ローカル - イコライザ 色相 HISTORY_MSG_983;ローカル - ノイズ除去 しきい値マスク 明るい HISTORY_MSG_984;ローカル - ノイズ除去 しきい値マスク 暗い -HISTORY_MSG_985;ローカル - ノイズ除去 ラプラス変換 +HISTORY_MSG_985;ローカル - ノイズ除去 ラプラス作用素 HISTORY_MSG_986;ローカル - ノイズ除去 強化 HISTORY_MSG_987;ローカル - 階調フィルタ しきい値マスク HISTORY_MSG_988;ローカル - 階調フィルタ 暗い領域のしきい値マスク @@ -1255,13 +1264,13 @@ HISTORY_MSG_1030;ローカル - レティネックス 復元のしきい値 HISTORY_MSG_1031;ローカル - レティネックス 暗い領域のしきい値マスク HISTORY_MSG_1032;ローカル - レティネックス 明るい領域のしきい値マスク HISTORY_MSG_1033;ローカル - レティネックス 減衰 -HISTORY_MSG_1034;ローカル - ノンローカルミーン - 強さ -HISTORY_MSG_1035;ローカル - ノンローカルミーン - ディテール -HISTORY_MSG_1036;ローカル - ノンローカルミーン - パッチ -HISTORY_MSG_1037;ローカル - ノンローカルミーン - 半径 -HISTORY_MSG_1038;ローカル - ノンローカルミーン - ガンマ +HISTORY_MSG_1034;ローカル - 非局所平均 - 強さ +HISTORY_MSG_1035;ローカル - 非局所平均 - ディテール +HISTORY_MSG_1036;ローカル - 非局所平均 - パッチ +HISTORY_MSG_1037;ローカル - 非局所平均 - 半径 +HISTORY_MSG_1038;ローカル - 非局所平均 - ガンマ HISTORY_MSG_1039;ローカル - 質感 - ガンマ -HISTORY_MSG_1040;ローカル - スポット - ソフトな半径 +HISTORY_MSG_1040;ローカル - SC - ソフトな半径 HISTORY_MSG_1041;ローカル - スポット - マンセル補正 HISTORY_MSG_1042;ローカル - 対数符号化 - しきい値 HISTORY_MSG_1043;ローカル - Exp - 標準化 @@ -1352,8 +1361,8 @@ HISTORY_MSG_1127;ローカル - Cie マスク ガンマ HISTORY_MSG_1128;ローカル - Cie マスク スロープ HISTORY_MSG_1129;ローカル - Cie 相対輝度 HISTORY_MSG_1130;ローカル - Cie 彩度 Jz -HISTORY_MSG_1131;ローカル - マスク 色ノイズ除去  -HISTORY_MSG_1132;ローカル - Cie ウェーブレット シグマ Jz +HISTORY_MSG_1131;ローカル - マスク - ノイズ除去  +HISTORY_MSG_1132;ローカル - Cie ウェーブレット シグマ Jz HISTORY_MSG_1133;ローカル - Cie ウェーブレット レベル Jz HISTORY_MSG_1134;ローカル - Cie ウェーブレット ローカルコントラスト Jz HISTORY_MSG_1135;ローカル - Cie ウェーブレット 明瞭 Jz @@ -1401,40 +1410,112 @@ HISTORY_MSG_DEHAZE_ENABLED;霞除去 HISTORY_MSG_DEHAZE_SATURATION;霞除去 - 彩度 HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;霞除去 - 深度マップの表示 HISTORY_MSG_DEHAZE_STRENGTH;霞除去 - 強さ +HISTORY_MSG_DIRPYRDENOISE_GAIN;NR - 明るさに応じた補整 HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;デュアルデモザイク - 自動しきい値 HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - コントラストのしきい値 -HISTORY_MSG_EDGEFFECT;エッジの効果調整 +HISTORY_MSG_EDGEFFECT;エッジの減衰応答 +HISTORY_MSG_FF_FROMMETADATA;フラットフィールド - メタデータから HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - 参考出力 HISTORY_MSG_FILMNEGATIVE_COLORSPACE;ネガフィルムの色空間 HISTORY_MSG_FILMNEGATIVE_ENABLED;ネガフィルム HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - 参考入力 HISTORY_MSG_FILMNEGATIVE_VALUES;ネガフィルムの値 -HISTORY_MSG_HISTMATCHING;トーンカーブの自動調節 +HISTORY_MSG_GAMUTMUNSEL;色域-マンセル +HISTORY_MSG_HISTMATCHING;トーンカーブの自動整合 HISTORY_MSG_HLBL;Color 色の波及 - ぼかし -HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +HISTORY_MSG_HLTH;インペイント オポーズド - ゲインのしきい値 +HISTORY_MSG_ICL_LABGRIDCIEXY;Cie表色系 xy HISTORY_MSG_ICM_AINTENT;アブストラクトプロファイルの意図 -HISTORY_MSG_ICM_BLUX;原色 ブルー X +HISTORY_MSG_ICM_BLUX;原色 ブルー X HISTORY_MSG_ICM_BLUY;原色 ブルー Y +HISTORY_MSG_ICM_CAT;カラーマトリクスの適応 HISTORY_MSG_ICM_FBW;白黒 +HISTORY_MSG_ICM_GAMUT;色域の抑制 HISTORY_MSG_ICM_GREX;原色 グリーン X HISTORY_MSG_ICM_GREY;原色 グリーン Y -HISTORY_MSG_ICM_OUTPUT_PRIMARIES;出力 - プライマリ +HISTORY_MSG_ICM_MIDTCIE;中間トーン +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;出力 - 原色 HISTORY_MSG_ICM_OUTPUT_TEMP;出力 - ICC-v4 光源 D HISTORY_MSG_ICM_OUTPUT_TYPE;出力 - タイプ HISTORY_MSG_ICM_PRESER;ニュートラルを維持 HISTORY_MSG_ICM_REDX;原色 レッド X HISTORY_MSG_ICM_REDY;原色 レッド Y  -HISTORY_MSG_ICM_WORKING_GAMMA;作業色空間 - ガンマ +HISTORY_MSG_ICM_REFI;色の微調整 +HISTORY_MSG_ICM_SHIFTX;色の微調整 - シフト x +HISTORY_MSG_ICM_SHIFTY;色の微調整 - シフト y +HISTORY_MSG_ICM_SMOOTHCIE;ハイライト調整の減衰 +HISTORY_MSG_ICM_TRCEXP;アブストラクトプロファイル +HISTORY_MSG_ICM_WORKING_GAMMA;TRC - ガンマ HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;輝度 方式 HISTORY_MSG_ICM_WORKING_PRIM_METHOD;原色 方式 -HISTORY_MSG_ICM_WORKING_SLOPE;作業色空間 - 勾配 +HISTORY_MSG_ICM_WORKING_SLOPE;TRC - スロープ HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRCの方式 -HISTORY_MSG_ILLUM;輝度 +HISTORY_MSG_ILLUM;CAL - SC - 輝度 HISTORY_MSG_LOCALCONTRAST_AMOUNT;ローカルコントラスト - 量 HISTORY_MSG_LOCALCONTRAST_DARKNESS;ローカルコントラスト - 暗い部分 HISTORY_MSG_LOCALCONTRAST_ENABLED;ローカルコントラスト HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;ローカルコントラスト - 明るい部分 HISTORY_MSG_LOCALCONTRAST_RADIUS;ローカルコントラスト - 半径 +HISTORY_MSG_LOCALLAB_TE_PIVOT;ローカル - イコライザ ピボット +HISTORY_MSG_LOCAL_CIEMASK_BLURCONT;ローカル編集 Cieのマスク ぼかし コントラスト +HISTORY_MSG_LOCAL_CIEMASK_BLURFFT;ローカル編集 Cieのマスク ぼかし 高速フーリエ変換 +HISTORY_MSG_LOCAL_CIEMASK_BLURRAD;ローカル編集 Cieのマスク ぼかし 半径 +HISTORY_MSG_LOCAL_CIEMASK_CHH; ローカル編集 Cieのマスク 色相カーブ +HISTORY_MSG_LOCAL_CIEMASK_HIGH;ローカル編集 Cieのマスク ハイライト +HISTORY_MSG_LOCAL_CIEMASK_SHAD;ローカル編集 Cieのマスク シャドウ +HISTORY_MSG_LOCAL_CIEMASK_STRU;ローカル編集 Cieのマスク 構造 +HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;機能としてのCieの構造マスク +HISTORY_MSG_LOCAL_CIEMASK_WLC;ローカル編集 Cieのマスク ウェーブレット Lc +HISTORY_MSG_LOCAL_CIEMASK_WLEV;ローカル編集 Cieのマスク ウェーブレットのレベル +HISTORY_MSG_LOCAL_CIE_ANGGRAD;ローカル編集 CIECAM - 諧調フィルタの角度 +HISTORY_MSG_LOCAL_CIE_BLACKS;ローカル編集 CIECAM - ブラックの分布 +HISTORY_MSG_LOCAL_CIE_BLUXL;ローカル編集 CIECAM - ブルー X +HISTORY_MSG_LOCAL_CIE_BLUYL;ローカル編集 CIECAM - ブルー Y +HISTORY_MSG_LOCAL_CIE_BRICOMP;ローカル編集 CIECAM 明るさの圧縮 +HISTORY_MSG_LOCAL_CIE_BRICOMPTH;ローカル編集 CIECAM 明るさの圧縮のしきい値 +HISTORY_MSG_LOCAL_CIE_BWCIE;ローカル編集 CIECAM - 白黒 +HISTORY_MSG_LOCAL_CIE_CAT;マトリクスの適合 +HISTORY_MSG_LOCAL_CIE_DETAILJZ;ローカル編集 JzCzHz ローカルコントラスト +HISTORY_MSG_LOCAL_CIE_ENAMASKALL;ローカル編集 CIECAM 全てのマスクツール +HISTORY_MSG_LOCAL_CIE_EXPPRECAM;ローカル編集 CIECAM 前処理 +HISTORY_MSG_LOCAL_CIE_GAM;ローカル編集 CIECAM ガンマ +HISTORY_MSG_LOCAL_CIE_GAMUTCIE;ローカル編集 CIECAM 色域 +HISTORY_MSG_LOCAL_CIE_GREXL;ローカル編集 CIECAM - グリーン X +HISTORY_MSG_LOCAL_CIE_GREYL;ローカル編集 CIECAM - グリーン Y +HISTORY_MSG_LOCAL_CIE_ILL;ローカル編集 CIECAM TRC 輝度 +HISTORY_MSG_LOCAL_CIE_LOGCIEQ;ローカル編集 CIECAM 対数符号化 Q +HISTORY_MSG_LOCAL_CIE_MIDT;ローカル編集 CIECAM 中間トーン +HISTORY_MSG_LOCAL_CIE_NORM;ローカル編集 CIECAM 輝度の正常化 +HISTORY_MSG_LOCAL_CIE_PRIM;ローカル編集 CIECAM TRC 原色 +HISTORY_MSG_LOCAL_CIE_REDXL;ローカル編集 CIECAM - レッド X +HISTORY_MSG_LOCAL_CIE_REDYL;ローカル編集 CIECAM - レッド Y +HISTORY_MSG_LOCAL_CIE_REFI;ローカル編集 CIECAM 色の微調整 +HISTORY_MSG_LOCAL_CIE_SATCIE;ローカル編集 CIECAM - 彩度の制御 +HISTORY_MSG_LOCAL_CIE_SHIFTXL;ローカル編集 CIECAM - シフト x +HISTORY_MSG_LOCAL_CIE_SHIFTYL;ローカル編集 CIECAM - シフト y +HISTORY_MSG_LOCAL_CIE_SIG;シグモイド +HISTORY_MSG_LOCAL_CIE_SIGADAP;ローカル編集 CIECAM シグモイドの適応性 +HISTORY_MSG_LOCAL_CIE_SIGMET;ローカル編集 CIECAM - シグモイドの方式 +HISTORY_MSG_LOCAL_CIE_SLOP;ローカル編集 CIECAM - スロープ +HISTORY_MSG_LOCAL_CIE_SLOPESMO;ローカル編集 CIECAM - グレーポイントのバランス +HISTORY_MSG_LOCAL_CIE_SLOPESMOB;ローカル編集 CIECAM - ブルーのバランス +HISTORY_MSG_LOCAL_CIE_SLOPESMOG;ローカル編集 CIECAM - グリーンのバランス +HISTORY_MSG_LOCAL_CIE_SLOPESMOR;ローカル編集 CIECAM - レッドのバランス +HISTORY_MSG_LOCAL_CIE_SMOOTH;ローカル編集 CIECAM - 場面条件のYbのスケール +HISTORY_MSG_LOCAL_CIE_SMOOTHMET;ローカル編集 CIECAM - 減衰の基準 +HISTORY_MSG_LOCAL_CIE_SMOOTHYB;ローカル編集 CIECAM - 観視条件のYbの尺度 +HISTORY_MSG_LOCAL_CIE_SMOOTH_LUM;ローカル編集 CIECAM - レベル - 明るさのモード +HISTORY_MSG_LOCAL_CIE_STRGRAD;ローカル編集 CIECAM - 諧調の強さ L +HISTORY_MSG_LOCAL_CIE_STRLOG;ローカル編集 CIECAM - 対数符号化の強さ +HISTORY_MSG_LOCAL_CIE_TRC;ローカル編集 CIECAM - TRC +HISTORY_MSG_LOCAL_CIE_WHITES;ローカル編集 CIECAM - ホワイトの分布 +HISTORY_MSG_LOCAL_DEHAZE_BLACK;ローカル - 霞除去 - ブラック +HISTORY_MSG_LOCAL_GAMUTMUNSEL;ローカル - SC - 色ずれの回避 +HISTORY_MSG_LOCAL_LOG_BLACKS;ローカル編集 対数符号化 - ブラックの分布 +HISTORY_MSG_LOCAL_LOG_COMPR;ローカル編集 対数符号化 - 明るさの圧縮 +HISTORY_MSG_LOCAL_LOG_SAT;ローカル編集 対数符号化 - 彩度の制御 +HISTORY_MSG_LOCAL_LOG_WHITES;ローカル編集 対数符号化 - ホワイトの分布 +HISTORY_MSG_LOCAL_TMO_SATUR;ローカル編集 露光 Fattal 彩度 HISTORY_MSG_METADATA_MODE;メタデータ コピーモード HISTORY_MSG_MICROCONTRAST_CONTRAST;マイクロコントラスト - コントラストのしきい値 HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - しきい値の自動設定 @@ -1480,10 +1561,15 @@ HISTORY_MSG_SPOT_ENTRY;スポット除去 - ポイント変更 HISTORY_MSG_TEMPOUT;CAM02/16 自動色温度設定 HISTORY_MSG_THRESWAV;バランスのしきい値 HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - アンカー +HISTORY_MSG_TONE_EQUALIZER_BANDS;トーンイコライザ - バンド +HISTORY_MSG_TONE_EQUALIZER_ENABLED;トーンイコライザ +HISTORY_MSG_TONE_EQUALIZER_PIVOT;トーンイコライザ - ピボット +HISTORY_MSG_TONE_EQUALIZER_REGULARIZATION;トーンイコライザ - 円滑 +HISTORY_MSG_TONE_EQUALIZER_SHOW_COLOR_MAP;トーンイコライザ - トーンの配分 HISTORY_MSG_TRANS_METHOD;ジオメトリ - 方式 HISTORY_MSG_WAVBALCHROM;イコライザ 色度 HISTORY_MSG_WAVBALLUM;イコライザ 輝度 -HISTORY_MSG_WAVBL;レベルのぼかし +HISTORY_MSG_WAVBL;詳細レベルのぼかし HISTORY_MSG_WAVCHR;レベルのぼかし - 色度のぼかし HISTORY_MSG_WAVCHROMCO;大きいディテールの色度 HISTORY_MSG_WAVCHROMFI;小さいディテールの色度 @@ -1519,6 +1605,23 @@ HISTORY_MSG_WAVSTREND;ソフトの強さ HISTORY_MSG_WAVTHRDEN;ローカルコントラストのしきい値 HISTORY_MSG_WAVTHREND;ローカルコントラストのしきい値 HISTORY_MSG_WAVUSHAMET;明瞭の方式 +HISTORY_MSG_WBALANCE_OBSERVER10;標準観測者10° +HISTORY_MSG_WBITC_CUSTOM;Itcwb カスタム +HISTORY_MSG_WBITC_DELTA;Itcwb 色偏差のΔ +HISTORY_MSG_WBITC_FGREEN;Itcwb 色偏差 - スチューデント検定 +HISTORY_MSG_WBITC_FORCE;Itcwb 強制 +HISTORY_MSG_WBITC_GREEN;色偏差の微調整 +HISTORY_MSG_WBITC_MINSIZE;最小のパッチ +HISTORY_MSG_WBITC_NOPURPLE;Itcwb 非パープル +HISTORY_MSG_WBITC_OBS;2段階アルゴリズムを外す +HISTORY_MSG_WBITC_PONDER;Itcwb バランス +HISTORY_MSG_WBITC_PRECIS;Itcwb 精度 +HISTORY_MSG_WBITC_PRIM;原色 +HISTORY_MSG_WBITC_RGREEN;Itcwb 色偏差の範囲 +HISTORY_MSG_WBITC_SAMPLING;ローサンプリング +HISTORY_MSG_WBITC_SIZE;Itcwb サイズ +HISTORY_MSG_WBITC_SORTED;Itcwb バランス +HISTORY_MSG_WBITC_THRES;Itcwb しきい値 HISTORY_NEWSNAPSHOT;追加 HISTORY_NEWSNAPSHOT_TOOLTIP;ショートカット: Alt-s HISTORY_SNAPSHOT;スナップショット @@ -1564,8 +1667,8 @@ ICCPROFCREATOR_PRIM_WIDEG;Widegamut ICCPROFCREATOR_PROF_V2;ICC v2 ICCPROFCREATOR_PROF_V4;ICC v4 ICCPROFCREATOR_SAVEDIALOG_TITLE;...でICCプロファイルを保存 -ICCPROFCREATOR_SLOPE;勾配 -ICCPROFCREATOR_TRC_PRESET;トーンリプレーススカーブ +ICCPROFCREATOR_SLOPE;スロープ +ICCPROFCREATOR_TRC_PRESET;トーンリプロダクションカーブ INSPECTOR_WINDOW_TITLE;カメラ出し画像 IPTCPANEL_CATEGORY;カテゴリ IPTCPANEL_CATEGORYHINT;画像の意図 @@ -1661,7 +1764,7 @@ MAIN_TAB_FAVORITES_TOOLTIP;ショートカット: Alt-u MAIN_TAB_FILTER;絞り込み MAIN_TAB_INSPECT;カメラ出しJPEG MAIN_TAB_IPTC;IPTC -MAIN_TAB_LOCALLAB;ローカル編集 +MAIN_TAB_LOCALLAB;選択的な編集 MAIN_TAB_LOCALLAB_TOOLTIP;ショートカット Alt-o MAIN_TAB_METADATA;メタデータ MAIN_TAB_METADATA_TOOLTIP;ショートカット: Alt-m @@ -1682,7 +1785,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ショートカット: p\n\nこの機能が使えるのはシャープニング機能が有効で、画像が100%以上に拡大されている場合だけ +MAIN_TOOLTIP_PREVIEWSHARPMASK;シャープニングのコントラストマスク\nショートカット: p\n\nこの機能が使えるのはシャープニング機能が有効で、画像が100%以上に拡大されている場合だけです MAIN_TOOLTIP_QINFO;画像の情報\nショートカット: i MAIN_TOOLTIP_SHOWHIDELP1;表示/非表示 左パネル\nショートカット: l MAIN_TOOLTIP_SHOWHIDERP1;表示/非表示 右パネル\nショートカット: Alt-l @@ -1738,6 +1841,7 @@ PARTIALPASTE_FLATFIELDBLURRADIUS;フラットフィールド ぼかし半径 PARTIALPASTE_FLATFIELDBLURTYPE;フラットフィールド ぼかしタイプ PARTIALPASTE_FLATFIELDCLIPCONTROL;フラットフィールド クリップコントロール PARTIALPASTE_FLATFIELDFILE;フラットフィールド ファイル +PARTIALPASTE_FLATFIELDFROMMETADATA;メタデータからフラットフィールドを選択 PARTIALPASTE_GRADIENT;減光フィルター PARTIALPASTE_HSVEQUALIZER;HSV イコライザ PARTIALPASTE_ICMSETTINGS;ICM 設定 @@ -1747,8 +1851,8 @@ PARTIALPASTE_LABCURVE;L*a*b* 調整 PARTIALPASTE_LENSGROUP;レンズ関係の設定 PARTIALPASTE_LENSPROFILE;プロファイルされたレンズ補正 PARTIALPASTE_LOCALCONTRAST;ローカルコントラスト -PARTIALPASTE_LOCALLAB;ローカル編集 -PARTIALPASTE_LOCALLABGROUP;ローカル編集の設定 +PARTIALPASTE_LOCALLAB;選択的な編集 +PARTIALPASTE_LOCALLABGROUP;選択的な編集の設定 PARTIALPASTE_METADATA;メタデータモード PARTIALPASTE_METAGROUP;メタデータ PARTIALPASTE_PCVIGNETTE;ビネットフィルター @@ -1785,6 +1889,7 @@ PARTIALPASTE_SHARPENMICRO;マイクロコントラスト PARTIALPASTE_SOFTLIGHT;ソフトライト PARTIALPASTE_SPOT;スポット除去 PARTIALPASTE_TM_FATTAL;ダイナミックレンジ圧縮 +PARTIALPASTE_TONE_EQUALIZER;トーンイコライザ PARTIALPASTE_VIBRANCE;自然な彩度 PARTIALPASTE_VIGNETTING;周辺光量補正 PARTIALPASTE_WHITEBALANCE;ホワイトバランス @@ -1794,7 +1899,6 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;カラーピッカーのフォント PREFERENCES_APPEARANCE_CROPMASKCOLOR;切り抜きのマスクカラー PREFERENCES_APPEARANCE_MAINFONT;メインフォント PREFERENCES_APPEARANCE_NAVGUIDECOLOR;ナビゲーターのガイドカラー -PREFERENCES_APPEARANCE_PSEUDOHIDPI;擬似HiDPIモード PREFERENCES_APPEARANCE_THEME;テーマ PREFERENCES_APPLNEXTSTARTUP;要再起動 PREFERENCES_AUTOMONPROFILE;OSのメインモニター・プロファイルを使用 @@ -1802,9 +1906,12 @@ PREFERENCES_AUTOSAVE_TP_OPEN;プログラム終了時の機能パネルの開閉 PREFERENCES_BATCH_PROCESSING;バッチ処理 PREFERENCES_BEHADDALL;すべて '追加' PREFERENCES_BEHADDALLHINT;すべてのパラメータを 追加モードにします\nバッチツールパネルで設定される調整値が、各画像の既定値に加算されます -PREFERENCES_BEHAVIOR;ビヘイビア +PREFERENCES_BEHAVIOR;作用 PREFERENCES_BEHSETALL;すべて '設定' PREFERENCES_BEHSETALLHINT;すべてのパラメータを 設定モードにします\nバッチツールパネルで設定される調整値が、各画像の既定値に取って代わり同一になります +PREFERENCES_BROWSERECURSIVEDEPTH;サブフォルダ階層数のブラウズ +PREFERENCES_BROWSERECURSIVEFOLLOWLINKS;サブフォルダをブラウズする際はシンボリックリンクに従う +PREFERENCES_BROWSERECURSIVEMAXDIRS;サブフォルダの最大数 PREFERENCES_CACHECLEAR;クリア PREFERENCES_CACHECLEAR_ALL;cacheに入れられたファイルを全てクリア: PREFERENCES_CACHECLEAR_ALLBUTPROFILES;cacheに入れた処理プロファイル以外をクリア: @@ -1813,6 +1920,7 @@ PREFERENCES_CACHECLEAR_SAFETY;casheに入れたファイルだけをクリア。 PREFERENCES_CACHEMAXENTRIES;cacheに入れるファイルの最大数 PREFERENCES_CACHEOPTS;cache オプション PREFERENCES_CACHETHUMBHEIGHT;サムネイル縦の最大値 +PREFERENCES_CAMERAPROFILESDIR;カメラプロファイルのディレクトリ PREFERENCES_CHUNKSIZES;スレッドごとのタイル PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE デモザイク PREFERENCES_CHUNKSIZE_RAW_CA;Raw 色収差補正 @@ -1868,6 +1976,11 @@ PREFERENCES_EXTEDITOR_DIR_CUSTOM;カスタム PREFERENCES_EXTEDITOR_DIR_TEMP;OS 一時ディレクトリ PREFERENCES_EXTEDITOR_FLOAT32;32-ビット 浮動小数点TIFF出力 PREFERENCES_EXTERNALEDITOR;外部エディタ +PREFERENCES_EXTERNALEDITOR_CHANGE;アプリケーションの変更 +PREFERENCES_EXTERNALEDITOR_CHANGE_FILE;実行ファイルの変更 +PREFERENCES_EXTERNALEDITOR_COLUMN_COMMAND;コマンド +PREFERENCES_EXTERNALEDITOR_COLUMN_NAME;名前 +PREFERENCES_EXTERNALEDITOR_COLUMN_NATIVE_COMMAND;ネイティブコマンド PREFERENCES_FBROWSEROPTS;ファイルブラウザ/サムネイルのオプション PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;ファイルブラウザのツールバーを圧縮 PREFERENCES_FLATFIELDFOUND;検出 @@ -1895,13 +2008,23 @@ PREFERENCES_INTENT_SATURATION;彩度 PREFERENCES_INTERNALTHUMBIFUNTOUCHED;rawファイルが未編集の場合 JPEGのサムネイルを表示 PREFERENCES_LANG;言語 PREFERENCES_LANGAUTODETECT;OSの言語設定を使用 +PREFERENCES_LENSFUNDBDIR;Lensfunのデータベースディレクトリ +PREFERENCES_LENSFUNDBDIR_TOOLTIP;このディレクトリはLensfunのデータを含んでいます。デフォルトのディレクトリを使うために空のままにしておきます。 +PREFERENCES_LENSPROFILESDIR;レンズプロファイルのディレクトリ +PREFERENCES_LENSPROFILESDIR_TOOLTIP;このディレクトリはAdobeのレンズコレクション(LCP)のデータを含んでいます。Directory containing Adobe Lens Correction Profiles (LCPs) PREFERENCES_MAXRECENTFOLDERS;直近のフォルダーの最大数 +PREFERENCES_MAX_ZOOM_TITLE;最大拡大率 PREFERENCES_MENUGROUPEXTPROGS;"..で開く"のグループ PREFERENCES_MENUGROUPFILEOPERATIONS;"ファイル操作"のグループ PREFERENCES_MENUGROUPLABEL;"カラーラベル"のグループ PREFERENCES_MENUGROUPPROFILEOPERATIONS;"処理プロファイル操作"のグループ PREFERENCES_MENUGROUPRANK;"ランキング"のグループ -PREFERENCES_MENUOPTIONS;メニューオプションの状況 +PREFERENCES_MENUOPTIONS;コンテキストメニューのオプション +PREFERENCES_METADATA;メタデータ +PREFERENCES_METADATA_SYNC;XMPサイドカーと同期しているメタデータ +PREFERENCES_METADATA_SYNC_NONE;オフ +PREFERENCES_METADATA_SYNC_READ;読み込みだけ +PREFERENCES_METADATA_SYNC_READWRITE;双方向 PREFERENCES_MONINTENT;デフォルトのレンダリングインテント PREFERENCES_MONITOR;モニター PREFERENCES_MONPROFILE;デフォルトのモニタープロファイル @@ -1961,10 +2084,12 @@ PREFERENCES_SND_HELP;ファイルパスを入力 または空欄(無音).\nWindo PREFERENCES_SND_LNGEDITPROCDONE;編集処理 終了 PREFERENCES_SND_QUEUEDONE;キュー処理 終了 PREFERENCES_SND_THRESHOLDSECS;数秒後 +PREFERENCES_SPOTLOC;ローカル編集のスポットの方式を決める PREFERENCES_STARTUPIMDIR;起動時の画像・ディレクトリ PREFERENCES_TAB_BROWSER;ファイルブラウザ PREFERENCES_TAB_COLORMGR;カラーマネジメント PREFERENCES_TAB_DYNAMICPROFILE;ダイナミックプロファイルの規定 +PREFERENCES_TAB_FAVORITES;お気に入りの機能 PREFERENCES_TAB_GENERAL;一般 PREFERENCES_TAB_IMPROC;画像処理 PREFERENCES_TAB_PERFORMANCE;パフォーマンス @@ -1973,10 +2098,32 @@ PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;埋め込まれているJPEGのプレビュ PREFERENCES_THUMBNAIL_INSPECTOR_MODE;表示する画像 PREFERENCES_THUMBNAIL_INSPECTOR_RAW;ニュートラルなrawレンダリング PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;埋め込まれているJPEGがフルサイズの場合、指定がなければニュートラルなrawレンダリングで表示 -PREFERENCES_TP_LABEL;ツール パネル: +PREFERENCES_THUMBNAIL_RANK_COLOR_MODE;サムネイルのランクと色をXMPサイドカーから読み込む、或いはサイドカーに保存する +PREFERENCES_TOOLPANEL_AVAILABLETOOLS;使用可能な機能 +PREFERENCES_TOOLPANEL_CLONE_FAVORITES;お気に入りの機能を元の場所にも保持する +PREFERENCES_TOOLPANEL_CLONE_FAVORITES_TOOLTIP;これを設定すると、お気に入りの機能がお気に入りのタブと独自のタブの両方に表示されます。\n\n注意: このオプションを有効にするとタブを切り替える際に若干の遅れが生じる場合があります。 +PREFERENCES_TOOLPANEL_FAVORITE;お気に入り +PREFERENCES_TOOLPANEL_FAVORITESPANEL;お気に入りのパネル +PREFERENCES_TOOLPANEL_TOOL;機能 +PREFERENCES_TP_LABEL;機能パネル: PREFERENCES_TP_VSCROLLBAR;ツールパネルの垂直スクロールバーを隠す PREFERENCES_USEBUNDLEDPROFILES;付属のプロファイルを使用 +PREFERENCES_WBA;ホワイトバランス +PREFERENCES_WBACORR;自動ホワイトバランス - 色温度の相関関係 +PREFERENCES_WBACORR_TOOLTIP;画像(rawファイルの形式、測色など)に応じて、これらの設定で “色温度の相関関係”アルゴリズムを適合させ、総合的に見て最良の結果を求めます。そのための各パラメータ調整に決められた規則は特にありません。\n\n設定パラメータは3種類あります:\n*インターフェイスでユーザーが設定するもの。\n*各pp3ファイルから読み込むもの:Itcwb_minsize=20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false(詳しくはRawPediaを参照)\n*オプションファイルで設定するもの(RawPediaを参照)\n結果に対する補正で、“自動ホワイトバランス バイアス”や“色偏差の微調整”を使うことが出来ます。これらを調整すると色温度、色偏差、相関関係が新たに計算されます。\n\n‘相関関係係数’、‘色度のパッチ’、‘ΔE’の3つの指標は、あくまで参考情報で変更することは出来ません。どれか一つの指標が良いからと言って、結果が良くなるわけではないからです。 +PREFERENCES_WBAENA;自動ホワイトバランスの色温度の相関関係設定を表示する +PREFERENCES_WBAENACUSTOM;カスタムの色温度と色偏差を使う +PREFERENCES_WBAFORC;追加的アルゴリズムの強制使用 +PREFERENCES_WBAGREENDELTA;色偏差の繰り返し計算における色温度のΔ (追加的アルゴリズムを有効にした場合) +PREFERENCES_WBANOPURP;パープルを使わない +PREFERENCES_WBAPATCH;画像で使われる色数の最大値 +PREFERENCES_WBAPRECIS;精度の高いアルゴリズム - スケールを使う +PREFERENCES_WBASIZEREF;ヒストグラムカラーの大きさと比較した基準色の大きさ +PREFERENCES_WBASORT;ヒストグラムの代わりに色度の順で並べ替える PREFERENCES_WORKFLOW;レイアウト +PREFERENCES_XMP_SIDECAR_MODE;XMP サイドカー形式 +PREFERENCES_XMP_SIDECAR_MODE_EXT;darktableに似た形式(FILENAME.ext.xmp for FILENAME.ext) +PREFERENCES_XMP_SIDECAR_MODE_STD;標準 (FILENAME.xmp for FILENAME.ext) PREFERENCES_ZOOMONSCROLL;スクロールを使って画像の拡大・縮小 PROFILEPANEL_COPYPPASTE;コピーするパラメータ PROFILEPANEL_GLOBALPROFILES;付属のプロファイル @@ -2025,21 +2172,43 @@ QINFO_PIXELSHIFT;ピクセルシフト / %2 フレーム QUEUE_AUTOSTART;オートスタート QUEUE_AUTOSTART_TOOLTIP;新しいrawファイルが送られて来たら自動的に現像処理を開始します QUEUE_DESTFILENAME;パスとファイル名 +QUEUE_DESTPREVIEW_TITLE;移動先のパスを表示するためにサムネイルをここで選択 +QUEUE_DESTPREVIEW_TOOLTIP;最初に選択した画像の移動先のパスがここに表示されます QUEUE_FORMAT_TITLE;ファイル形式 QUEUE_LOCATION_FOLDER;フォルダに保存 QUEUE_LOCATION_TEMPLATE;テンプレートを使う -QUEUE_LOCATION_TEMPLATE_TOOLTIP;次の書式文字を使用することができます:\n%f, %d1, %d2, ..., %p1, %p2, ...%r\n\nこれらの書式文字は画像パス名のそれぞれ別々の部分、画像の属性を参照します\n\n例えば、次の画像を処理中の場合は:\n\n/home/tom/photos/2010-10-31/dsc0042.nef\n書式文字の意味するものは:\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\n%rは写真のランクに置き換えられます。評価なしは%rは'0 'に置換されます。画像がごみ箱にある場合、%rは'X'に置換されます\n\n元画像と同じ場所に出力したい場合はこのように書きます:\n%p1/%f\n\n処理画像のディレクトリ下 "converted" という名前のディレクトリに出力画像を保存したい場合このように書きます:\n%p1/converted/%f\n\n"/home/tom/photos/converted/2010-10-31" という名前のディレクトリに出力画像を保存したい場合はこのように書きます:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TEMPLATE_HELP_BUTTON_TOOLTIP;ロケーションテンプレートの作成に関するヘルプパネルを表示/非表示します +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_BODY;出力画像を元画像と並べて保存したい場合は、次のように書きます: \n%p1/%f\n\n出力画像を元画像のフォルダの中にある'converted'というファルダに保存したい場合は、次のように書きます: \n%p1/converted/%f\n\n出力画像を\n'/home/tom/photos/converted/2010-10-31',に保存したい場合は次のように書きます: \n%p-3/converted/%P-4/%f +QUEUE_LOCATION_TEMPLATE_HELP_EXAMPLES_TITLE;共通例 +QUEUE_LOCATION_TEMPLATE_HELP_INTRO;出力のテンプレートフィールドは移動先のフォルダやファイルネームを柔軟にカスタマイズすることが出来ます。%で始まる特定の指定子を含めると、各ファイルが保存される際にプログラムにより置き換えられます。\n\n以下のセクションで指定子の各種類を説明します +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_1;このパス名を例として使うと: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_BODY_2;書式文字列の意味は: +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_LINUX;Linuxの場合は、/home/tom/photos/2010-10-31/photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_EXAMPLE_WINDOWS;Windowsの場合はD:\tom\photos\2010-10-31\photo1.raw +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO;%dN%d-N%pN%p-N%PN 及び %P-N (N は1から9) の指定子は画像ファイルのディレクトリパスの要素により置き換えられます\n書式指定子は次のように働きます:\n %dN はパスの最後からN番目のディレクトリ\n %d-Nはパスの初めからN番目のディレクトリ\n %pN はパスの最後からN番目までの全てのディレクトリ\n %p-N はパスの最初のN個のディレクトリ\n %PN はパスの最後のN個のディレクトリ\n %P-N はパスのN番目のディレクトから最後のディレクトリまで\n %f はベースネーム(拡張子なし) +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_INTRO_WINDOWS;Windowsのパスは、%d-1がドライブレターとコロン、%d-2がドライブのベースディレクトリとなります +QUEUE_LOCATION_TEMPLATE_HELP_PATHS_TITLE;ディレクトリと部分的パス +QUEUE_LOCATION_TEMPLATE_HELP_RANK_BODY;%r は写真のランクで置き換えられます。写真にランクが無い場合には'0'が使われます。写真がゴミ箱にある場合は、'x'が使われます。 +QUEUE_LOCATION_TEMPLATE_HELP_RANK_TITLE;ランク +QUEUE_LOCATION_TEMPLATE_HELP_RESULT_MISMATCH;ERROR: 2番目の結果は異なります: +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_BODY;%s1から%s9 はバッチ処理が始まった時点でのキューにおける画像の当初の位置で置き換えられます。数値はパディングを指定します、例えば%s3は'001'となります。 +QUEUE_LOCATION_TEMPLATE_HELP_SEQUENCE_TITLE;キューにおける位置と順番 +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_BODY;テンプレートでは3つの異なる日付/時間の値が使えます:\n %tE"%Y-%m-%d" は書き出しが行われた日時 \n %tF"%Y-%m-%d"はファイルが最後に保存された日時\n %tP"%Y-%m-%d" は写真が撮影された日時\n引用符が付けられた文字列は日付或いは時間の書式を定義します。%tF"%Y-%m-%d"という書式文字列はその1例です。文字列はg_date_time_format で指定された全ての文字列を使うことが出来ます。https://docs.gtk.org/glib/method.DateTime.format.html +QUEUE_LOCATION_TEMPLATE_HELP_TIMESTAMP_TITLE;日付と時間 +QUEUE_LOCATION_TEMPLATE_HELP_TITLE;出力テンプレートの作成 +QUEUE_LOCATION_TEMPLATE_TOOLTIP;その元画像のある場所、その画像のランク、その画像がゴミ箱に入っているかどうか、或いは、その画像がキューのどこにあるかに応じて、出力の場所を明記します。 \n\n%dN, %d-N, %pN, %p-N, %PN 及び %P-N (N = 1..9) は画像ファイルのディレクトリパスのエレメントによって置き換えられます(ファイルネームは含みません):\n%dN =パスの最後からN番目のディレクトリ\n%d-N =パスの最初からN番目のディレクトリ\n%pN =パスの最後からN番目までのすべてのディレクトリ\n%p-N =パスの中の最初のN個のディレクトリ\n%PN = パスの中の最後のN個のディレクトリ\n%P-N =パスの中のN番目のディレクトリ最後までのすべてのディレクトリ\n%f = ベースファイル名(拡張子は入れない)\nWindowsのパスでは、%d-1はドライブレターとコロン, %d-2 はそのドライブのベースディレクトリになります。\n\n一例として以下のパスネームを使います:\n/home/tom/photos/2010-10-31/photo1.raw\nフォーマットの文字列の意味は以下の通りです:\n%d4 = %d-1 = home\n%d3 = %d-2 = tom\n%d2 = %d-3 = photos\n%d1 = %d-4 = 2010-10-31\n%p1 = %p-4 = /home/tom/photos/2010-10-31/\n%p2 = %p-3 = /home/tom/photos/\n%p3 = %p-2 = /home/tom/\n%p4 = %p-1 = /home/\n%P1 = %P-4 = 2010-10-31/\n%P2 = %P-3 = photos/2010-10-31/\n%P3 = %P-2 = tom/photos/2010-10-31/\n%P4 = %P-1 = /home/tom/photos/2010-10-31/\n%f = photo1\n\n%rは画像のランクにより置き換えられます。画像にランクが付いていない場合は、0'が使われます。 画像がゴミ箱の中にある場合は'x'が使われます。\n\n%s1から%s9 はキューが始まった時の画像の元々の場所で置き換えられます。数値はパディングを指定します。例えば、%s3 とした場合は、結果が'001'のようになります。\n\n出力画像を元画像に並べて保存したいのであれば、次のように記述します:\n%p1/%f\n\n出力画像を元画像のフォルダー内にある'converted'という名前のフォルダーに保存したい場合は次のように記述します: \n%p1/converted/%f\n\n出力画像を\n'/home/tom/photos/converted/2010-10-31',というフォルダーに保存したい場合は、次のように記述します:\n%p-3/converted/%P-4/%f QUEUE_LOCATION_TITLE;出力の場所 QUEUE_STARTSTOP_TOOLTIP;キューにある画像の現像を始める、或いは中止する\n\nショートカット: Ctrl+s SAMPLEFORMAT_0;データ形式不明 -SAMPLEFORMAT_1;符号なし8ビット -SAMPLEFORMAT_2;符号なし16ビット -SAMPLEFORMAT_4;LogLuv24ビット -SAMPLEFORMAT_8;LogLuv32ビット +SAMPLEFORMAT_1;8ビット符号なし +SAMPLEFORMAT_2;16ビット符号なし +SAMPLEFORMAT_4;24ビットLogLuv +SAMPLEFORMAT_8;32ビットLogLuv SAMPLEFORMAT_16;16ビット浮動小数点 SAMPLEFORMAT_32;24ビット浮動小数点 SAMPLEFORMAT_64;32ビット浮動小数点 SAVEDLG_AUTOSUFFIX;ファイルが存在する場合、自動的に末尾に文字を加える +SAVEDLG_BIGTIFF;BigTIFF (メタデータのサポートなし) SAVEDLG_FILEFORMAT;ファイル形式 SAVEDLG_FILEFORMAT_FLOAT;浮動小数点 SAVEDLG_FORCEFORMATOPTS;強制保存オプション @@ -2059,12 +2228,23 @@ SAVEDLG_WARNFILENAME;ファイルに名前が付けられます SHCSELECTOR_TOOLTIP;この3つのスライダーの位置をリセットするには\nマウスの右ボタンをクリック SOFTPROOF_GAMUTCHECK_TOOLTIP;有効にすると、出力プロファイルの色域から外れた色のピクセルをグレーで表示します SOFTPROOF_TOOLTIP;ソフトプルーフィング\n有効にすると、ICMツールの出力プロファイルを使った疑似的なレンダリングを行います。印刷した場合などの画像の印象を掴むのに大変便利です。 +SORT_ASCENDING;昇順 +SORT_BY_DATE;日付順 +SORT_BY_EXIF;EXIF順 +SORT_BY_LABEL;カラーラベル順 +SORT_BY_NAME;名前順 +SORT_BY_RANK;ランク順 +SORT_DESCENDING;降順 +TC_LOCALLAB_PRIM_SHIFTX;シフト x +TC_LOCALLAB_PRIM_SHIFTX_TOOLTIP;“色の微調整”と併用することで:\n1)低い値を設定すると、画像の彩度が変わります。\n2)高い値は、穏やかなカラートーン調整になります。\n3)但し、CIE xyダイヤグラムから外れないように注意します。 +TC_LOCALLAB_PRIM_SHIFTY;シフト y TC_PRIM_BLUX;Bx TC_PRIM_BLUY;By TC_PRIM_GREX;Gx TC_PRIM_GREY;Gy TC_PRIM_REDX;Rx TC_PRIM_REDY;Ry +TC_PRIM_REFI;色の微調整(ホワイトポイント) THRESHOLDSELECTOR_B;下 THRESHOLDSELECTOR_BL;下-左 THRESHOLDSELECTOR_BR;下-右 @@ -2141,7 +2321,7 @@ TP_CACORRECTION_LABEL;色収差補正 TP_CACORRECTION_RED;レッド TP_CBDL_AFT;白黒適用の後 TP_CBDL_BEF;白黒適用の前 -TP_CBDL_METHOD;処理の順番 +TP_CBDL_METHOD;位置づけられた処理 TP_CBDL_METHOD_TOOLTIP;詳細レベルによるコントラスト調整の処理を白黒処理の前に行うか、後に行うか選びます。前を選んだ場合は同機能の作業色空間はRGBとなり、後を選んだ場合はL*a*b*となります。 TP_CHMIXER_BLUE;ブルー TP_CHMIXER_GREEN;グリーン @@ -2175,7 +2355,8 @@ TP_COLORAPP_CHROMA_M_TOOLTIP;CIECAM02/16の鮮やかさは、グレーと比較 TP_COLORAPP_CHROMA_S;彩度 (S) TP_COLORAPP_CHROMA_S_TOOLTIP;CIECAM02/16の彩度は、色刺激自体が持つ明るさと比較したその色合いに該当するもので、L*a*b*やRGBの彩度とは異なります。 TP_COLORAPP_CHROMA_TOOLTIP;CIECAM02/16の色度は、同一の観視環境の下では白に見える色刺激と比較した、その色刺激の'色合い'に相当するもので、L*a*b*やRGBの色度とは異なります。 -TP_COLORAPP_CIECAT_DEGREE;CAT02/16(色順応変換02/16) +TP_COLORAPP_CIECAT_DEGREE;色順応変換 場面条件 +TP_COLORAPP_CIECAT_DEGREEOUT;色順応変換 観視条件 TP_COLORAPP_CONTRAST;コントラスト (J) TP_COLORAPP_CONTRAST_Q;コントラスト (Q) TP_COLORAPP_CONTRAST_Q_TOOLTIP;CIECAM02/16のコントラスト(Q) は明るさに基づくもので、L*a*b*やRGBのコントラストとは異なります @@ -2224,12 +2405,12 @@ TP_COLORAPP_NEUTRAL_TOOLTIP;全てのスライダーチェックボックスと TP_COLORAPP_RSTPRO;レッドと肌色トーンを保護 TP_COLORAPP_RSTPRO_TOOLTIP;レッドと肌色トーンを保護はスライダーとカーブの両方に影響します TP_COLORAPP_SOURCEF_TOOLTIP;撮影条件に合わせて、その条件とデータを通常の範囲に収めます。ここで言う“通常”とは、平均的或いは標準的な条件とデータのことです。例えば、CIECAM02/16の補正を計算に入れずに収める。 -TP_COLORAPP_SURROUND;観視時の周囲環境 +TP_COLORAPP_SURROUND;周囲環境 TP_COLORAPP_SURROUNDSRC;撮影時の周囲環境 TP_COLORAPP_SURROUND_AVER;平均 TP_COLORAPP_SURROUND_DARK;暗い TP_COLORAPP_SURROUND_DIM;薄暗い -TP_COLORAPP_SURROUND_EXDARK;非常に暗い +TP_COLORAPP_SURROUND_EXDARK;非常に暗い TP_COLORAPP_SURROUND_TOOLTIP;出力デバイスで観視する時の周囲環境を考慮するため、画像の明暗と色を変えます\n\n平均:\n周囲が平均的な明るさ(標準)\n画像は変わりません\n\n薄暗い:\n薄暗い環境、例、TVを見る環境\n画像は若干暗くなります\n\n暗い:\n暗い環境 例、プロジェクターを見る環境\n画像はかなり暗くなります\n\n非常に暗い:\n非常に暗い環境 (例、カットシートを使っている)\n画像はとても暗くなります TP_COLORAPP_SURSOURCE_TOOLTIP;撮影時の周囲環境を考慮するため、画像の明暗と色を変えます。\n平均:周囲が平均的な明るさ(標準)。画像は変化しません。\n\n薄暗い:画像が少し明るくなります。\n\n暗い:画像が更に明るくなります。\n\n非常に暗い:画像は非常に明るくなります。 TP_COLORAPP_TCMODE_BRIGHTNESS;明るさ @@ -2241,6 +2422,7 @@ TP_COLORAPP_TCMODE_LABEL3;カーブ・色度モード TP_COLORAPP_TCMODE_LIGHTNESS;明度 TP_COLORAPP_TCMODE_SATUR;彩度 TP_COLORAPP_TEMP2_TOOLTIP;シンメトリカルモードの場合はホワイトバランスの色温度を使います\n色偏差は常に1.0\n\nA光源 色温度=2856\nD41 色温度=4100\nD50 色温度=5003\nD55 色温度=5503\nD60 色温度=6000\nD65 色温度=6504\nD75 色温度=7504 +TP_COLORAPP_TEMPOUT_TOOLTIP;色温度と色偏差\n前に行われた選択に応じて、選択された色温度は:\nホワイトバランスが次のように\nA光源=2856\nD41=4100\nD50=5003\nD55=5503\nD60=6000\nD65=6504\nD75=7504\n或いはフリー\nになります TP_COLORAPP_TEMP_TOOLTIP;選択した光源に関し色偏差は常に1が使われます\n\n色温度=2856\nD50 色温度=5003\nD55 色温度=5503\nD65 色温度=6504\nD75 色温度=7504 TP_COLORAPP_TONECIE;CIECAM02/16を使ったトーンマッピング TP_COLORAPP_TONECIE_TOOLTIP;このオプションが無効になっている場合、トーンマッピングはL*a*b*空間を使用します\nこのオプションが有効になっている場合、トーンマッピングは、CIECAM02/16を使用します\nトーンマッピング(L*a*b*/CIECAM02)ツールを有効にするには、この設定を有効にする必要があります @@ -2362,6 +2544,8 @@ TP_DIRPYRDENOISE_LUMINANCE_CURVE;輝度カーブ TP_DIRPYRDENOISE_LUMINANCE_DETAIL;輝度 細部の復元 TP_DIRPYRDENOISE_LUMINANCE_FRAME;輝度ノイズ TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;輝度 +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN;明るさに応じた補整 +TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;画像の明るさに応じてノイズ低減の強さを変えます。画像が暗い場合はノイズ低減の強さを下げ、明るい画像では上げます。 TP_DIRPYRDENOISE_MAIN_COLORSPACE;色空間 TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB @@ -2455,9 +2639,11 @@ TP_FILMNEGATIVE_GUESS_TOOLTIP;レッドとブルーの比率を、元画像の TP_FILMNEGATIVE_LABEL;ネガフィルム TP_FILMNEGATIVE_OUT_LEVEL;出力のレベル TP_FILMNEGATIVE_PICK;ニュートラルなポイントをピック +TP_FILMNEGATIVE_PICK_SIZE;サイズ: TP_FILMNEGATIVE_RED;レッドの比率 TP_FILMNEGATIVE_REF_LABEL;入力RGB: %1 TP_FILMNEGATIVE_REF_PICK;ホワイトバランスのスポットをピックアップ +TP_FILMNEGATIVE_REF_SIZE;サイズ: TP_FILMNEGATIVE_REF_TOOLTIP;ポジの画像でホワイトバランスの取れているグレーの部分をピックアップします TP_FILMSIMULATION_LABEL;フィルムシミュレーション TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapeeはフィルムシミュレーション機能に使う画像をHald CLUTフォルダーの中から探すよう設計されています(プログラムに組み込むにはフォルダーが大き過ぎるため)。\n変更するには、環境設定 > 画像処理 > フィルムシミュレーションと進み\nどのフォルダーが使われているか確認します。機能を利用する場合は、Hald CLUTだけが入っているフォルダーを指定するか、 この機能を使わない場合はそのフォルダーを空にしておきます。\n\n詳しくはRawPediaを参照して下さい。\n\nフィルム画像のスキャンを止めますか? @@ -2472,6 +2658,7 @@ TP_FLATFIELD_BT_VERTHORIZ;垂直 + 水平 TP_FLATFIELD_BT_VERTICAL;垂直 TP_FLATFIELD_CLIPCONTROL;クリップコントロール TP_FLATFIELD_CLIPCONTROL_TOOLTIP;クリップコントロールは、フラットフィールドを使った時に白飛びが発生するのを避けるために使います。適用する元画像に既に白飛びがある場合は、クリップコントロールの適用で色被りが起こる可能性があります。 +TP_FLATFIELD_FROMMETADATA;メタデータから TP_FLATFIELD_LABEL;フラットフィールド TP_GENERAL_11SCALE_TOOLTIP;この機能の効果や、そのサブコンポーネントの確認には、プレビューで1:1以上のスケールが必要です。 TP_GRADIENT_CENTER;中央位置 @@ -2489,8 +2676,10 @@ TP_GRADIENT_STRENGTH_TOOLTIP;終点位置でのフィルターの強さ TP_HLREC_BLEND;ブレンド TP_HLREC_CIELAB;CIEL*a*b* ブレンディング TP_HLREC_COLOR;色の波及 +TP_HLREC_COLOROPP;インペイント オポーズド TP_HLREC_ENA_TOOLTIP;自動露光でも動作可 TP_HLREC_HLBLUR;ぼかし +TP_HLREC_HLTH;ゲインのしきい値 TP_HLREC_LABEL;ハイライト復元 TP_HLREC_LUMINANCE;輝度復元 TP_HLREC_METHOD;方式: @@ -2506,10 +2695,12 @@ TP_ICM_APPLYHUESATMAP_TOOLTIP;DCPに埋め込まれているベーステーブ TP_ICM_APPLYLOOKTABLE;ルックテーブル TP_ICM_APPLYLOOKTABLE_TOOLTIP;DCPに埋め込まれているルックテーブルを用います。但し、適用するDCPにこのタグがある場合に限ります。 TP_ICM_BPC;ブラックポイント補正 +TP_ICM_BW;白黒 TP_ICM_DCPILLUMINANT;光源 TP_ICM_DCPILLUMINANT_INTERPOLATED;補間 TP_ICM_DCPILLUMINANT_TOOLTIP;埋め込まれているDCPの光源のどちらを使うか選択。デフォルトではホワイトバランスに基づいて二つの光源の中間に補間する。この設定は二つのDCPの光源が補間サポートされる、を選択している場合に有効。 TP_ICM_FBW;白黒 +TP_ICM_GAMUT;色域の制御 TP_ICM_ILLUMPRIM_TOOLTIP;撮影条件に最も相応しい光源を選びます\n変更が行われるのは、‘変換先の原色’で‘カスタム (スライダー)’が選択された時だけです。 TP_ICM_INPUTCAMERA;カメラの標準的プロファイル TP_ICM_INPUTCAMERAICC;カメラプロファイルの自動調和 @@ -2518,8 +2709,8 @@ TP_ICM_INPUTCAMERA_TOOLTIP;dcrawのシンプルなカラー・マトリクス、 TP_ICM_INPUTCUSTOM;カスタム TP_ICM_INPUTCUSTOM_TOOLTIP;独自の DCP/ICCプロファイルファイルを選択 TP_ICM_INPUTDLGLABEL;DCP/ICC 入力プロファイルを選択... -TP_ICM_INPUTEMBEDDED;埋め込み使用, 可能なら -TP_ICM_INPUTEMBEDDED_TOOLTIP;raw以外のファイルに埋め込まれたカラープロファイルを使用 +TP_ICM_INPUTEMBEDDED;埋め込まれているプロファイルを使用 +TP_ICM_INPUTEMBEDDED_TOOLTIP;ファイルに埋め込まれているカラープロファイルを使用\nファイルがない場合は、カメラ標準のプロファイルに戻る TP_ICM_INPUTNONE;プロファイルなし TP_ICM_INPUTNONE_TOOLTIP;すべてにカラープロファイルを使用しない 特殊な場合にのみ使用 TP_ICM_INPUTPROFILE;入力プロファイル @@ -2529,9 +2720,9 @@ TP_ICM_NEUTRAL;リセット TP_ICM_NOICM;No ICM: sRGB 出力 TP_ICM_OUTPUTPROFILE;出力プロファイル TP_ICM_OUTPUTPROFILE_TOOLTIP;デフォルトでは、全てのRTv4或いはRTv2プロファイルでTRC - sRGB: ガンマ=2.4 勾配=12.92が適用されています\n\n'ICCプロファイルクリエーター'でv4或いはv2のプロファイルを以下の条件で作成出来ます;\n 原色: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n TRC: BT709, sRGB, 線形, 標準ガンマ=2.2, 標準ガンマ=1.8, カスタム\n 光源: D41, D50, D55, D60, D65, D80, stdA 2856K -TP_ICM_PRIMBLU_TOOLTIP;原色 ブルー:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 -TP_ICM_PRIMGRE_TOOLTIP;原色 グリーン:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 -TP_ICM_PRIMILLUM_TOOLTIP;画像を元のモード(“作業プロファイル”)から異なるモード(“変換先の原色”)に変えることが出来ます。画像に対し異なるカラーモードを選択すると、画像の色値を恒久的に変えることになります。\n\n‘原色’の変更は非常に複雑で、その使い方は非常に難しいものです。熟達した経験が必要です。\nチャンネルミキサーの原色のように、エキゾチックな色の調整が可能です。\nカスタム(スライダー)を使ってカメラのキャリブレーションを変えることが出来ます。 +TP_ICM_PRIMBLU_TOOLTIP;原色 ブルー:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +TP_ICM_PRIMGRE_TOOLTIP;原色 グリーン:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +TP_ICM_PRIMILLUM_TOOLTIP;画像をオリジナルモード(作業プロファイル)から異なるモード(変換先の原色)へ変更が出来ます。画像のカラーモードを他のモードに変えると、画像の色値を完全に変更することになります。\n\n原色の変更は複雑でその利用は簡単ではありません。多くの検証作業が必要です。\n花などの派手な色はチャンネルミキサーの原色として変更が出来ます。\nカメラキャリブレーションはカスタム(スライダー)で変更が出来ます。 TP_ICM_PRIMRED_TOOLTIP;原色 レッド:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 TP_ICM_PROFILEINTENT;レンダリングの意図 TP_ICM_REDFRAME;カスタム 原色 @@ -2543,8 +2734,15 @@ TP_ICM_TONECURVE;トーンカーブ TP_ICM_TONECURVE_TOOLTIP;DCPに埋め込まれているトーンカーブを適用します。但し、この設定は選択したDCPにトーンカーブが埋め込まれている場合だけです。 TP_ICM_TRCFRAME;アブストラクトプロファイル TP_ICM_TRCFRAME_TOOLTIP;このプロファイルは‘シンセティック’または‘バーチャル’プロファイルとしても知られ、処理工程の最後(CIECAMの前))に適用されるもので、独自の画像効果を作ることが出来ます\n以下の要素に変更を加えることが出来ます:\n 画像のトーンを変えられる‘トーンリプロダクションカーブ’\n 撮影条件に適合するようにプロファイルの原色を変更する‘光源’\n 主にチャンネルミキサー、キャリブレーションの2つを使って変換先の原色を変える‘変換先の原色’\n注意: アブストラクトプロファイルは組み込まれている作業プロファイルを考慮するだけで、作業プロファイルの変更は行いません。カスタム作業プロファイルでは動作しません -TP_ICM_TRC_TOOLTIP;RawTherapeeのデフォルトで使われている‘トーンリプロダクションカーブ(TRC)’(g=2.4、s=12.92)を変えることが出来ます。\nTRCは画像のトーンを変えます。RGB、L*a*b*の値、ヒストグラム、出力(スクリーン、TIF、JPEG)が変わります。\nガンマは主に明るいトーンを変え、勾配は暗いトーンを変えます。\nどの様な‘ガンマ’と‘勾配’が選択出来ます(但し、1より大きい値)。このアルゴリズムはカーブの線形部分と放物線部分の連続性を確保します。\n‘なし’以外の選択で、‘光源’と‘変換先の原色’の中の一覧が有効になります。 +TP_ICM_TRC_TOOLTIP;RawTherapeeのデフォルトsRGBトーンリプロダクションカーブ(g=2.4 s=12.92)は変更が可能です。\nこのトーンリプロダクションカーブの変更は画像のトーンを変える機能です。RGB/Labの値、ヒストグラム、出力(スクリーン、TIF、JPG)が変わります。\nガンマは主に明るいトーンの変更、スロープは主に暗いトーンに作用します。\nどの様なガンマとスロープ(1より大きい)の組み合わせが選べます。アルゴリズムはカーブの線形部分と非線形部分の連続性を確保します。\n“なし”以外の選択をすると、“光源”と“相手先の原色”メニューが有効になります。 TP_ICM_WORKINGPROFILE;作業プロファイル +TP_ICM_WORKING_CAT;カラーマトリクスの適応 +TP_ICM_WORKING_CAT_BRAD;ブラッドフォード +TP_ICM_WORKING_CAT_CAT02;Cat02 +TP_ICM_WORKING_CAT_CAT16;Cat16 +TP_ICM_WORKING_CAT_TOOLTIP;XYZ変換マトリクスの色順応を実行します。デフォルトはブラッドフォードです +TP_ICM_WORKING_CAT_VK;フォンクリース係数 +TP_ICM_WORKING_CAT_XYZ;XYZスケール TP_ICM_WORKING_CIEDIAG;CIE xy ダイヤグラム TP_ICM_WORKING_ILLU;光源 TP_ICM_WORKING_ILLU_1500;タングステン 1500K @@ -2556,8 +2754,10 @@ TP_ICM_WORKING_ILLU_D60;D60 TP_ICM_WORKING_ILLU_D65;D65 TP_ICM_WORKING_ILLU_D80;D80 TP_ICM_WORKING_ILLU_D120;D120 +TP_ICM_WORKING_ILLU_E;E TP_ICM_WORKING_ILLU_NONE;デフォルト TP_ICM_WORKING_ILLU_STDA;stdA 2875K +TP_ICM_WORKING_NON;なし TP_ICM_WORKING_PRESER;パステルトーンを維持 TP_ICM_WORKING_PRIM;変換先の原色 TP_ICM_WORKING_PRIMFRAME_TOOLTIP;‘変換先の原色’のコンボボックスの中から‘カスタムCIE xyダイヤグラム’を選択すると、3つの原色がダイヤグラム上で変更可能となります。\n注意:この場合、ダイヤグラムのホワイトポイントの位置は更新されません。 @@ -2569,10 +2769,14 @@ TP_ICM_WORKING_PRIM_BRU;BruceRGB TP_ICM_WORKING_PRIM_BST;BestRGB TP_ICM_WORKING_PRIM_CUS;カスタム(スライダー) TP_ICM_WORKING_PRIM_CUSGR;カスタム(CIE xy ダイヤグラム) +TP_ICM_WORKING_PRIM_FREE;カスタム(スライダー) +TP_ICM_WORKING_PRIM_JDCMAX;JDC Max +TP_ICM_WORKING_PRIM_JDCMAXSTDA;JDC Max 標準A光源 TP_ICM_WORKING_PRIM_NONE;デフォルト TP_ICM_WORKING_PRIM_PROP;ProPhoto TP_ICM_WORKING_PRIM_REC;Rec2020 TP_ICM_WORKING_PRIM_SRGB;sRGB +TP_ICM_WORKING_PRIM_TOOLTIP;‘変換先の原色’(高度)により、画像の色(彩度)を復元或いは変更するために変換先の原色を変えることが出来ます。‘作業プロファイル’と‘変換先の原色’の違いが小さければ、カラーバランスは十分に保たれます。作業プロファイルは変わりません。色域が制御されます。\n‘カスタム(スライダー)’を選択すると、XとYに関するレッド、グリーン、ブルーの3原色の値を変えることが出来ます。 TP_ICM_WORKING_PRIM_WID;WideGamut TP_ICM_WORKING_TRC;トーンリプロダクションカーブ: TP_ICM_WORKING_TRC_18;Prophoto g=1.8 @@ -2582,13 +2786,11 @@ TP_ICM_WORKING_TRC_CUSTOM;カスタム TP_ICM_WORKING_TRC_GAMMA;ガンマ TP_ICM_WORKING_TRC_LIN;リニア g=1 TP_ICM_WORKING_TRC_NONE;なし -TP_ICM_WORKING_TRC_SLOPE;勾配 +TP_ICM_WORKING_TRC_SLOPE;スロープ TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 TP_ICM_WORKING_TRC_TOOLTIP;組み込まれたプロファイルだけ TP_IMPULSEDENOISE_LABEL;インパルスノイズ低減 TP_IMPULSEDENOISE_THRESH;しきい値 -TP_LABCURVE_AVOIDCOLORSHIFT;色ずれを回避 -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;作業色空間の色域に色を合わせ、マンセル補正を適用します(均等知覚色空間) TP_LABCURVE_BRIGHTNESS;明度 TP_LABCURVE_CHROMATICITY;色度 TP_LABCURVE_CHROMA_TOOLTIP;白黒トーンを適用するには、彩度を-100に設定します @@ -2653,7 +2855,7 @@ TP_LOCALLAB_ARTIF_TOOLTIP;ΔE-スコープのしきい値:スコープを適 TP_LOCALLAB_AUTOGRAY;自動平均輝度(Yb%) TP_LOCALLAB_AUTOGRAYCIE;自動 TP_LOCALLAB_AVOID;色ずれの回避 -TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;作業色空間の色域に色を収め、マンセル補正を行います(均一的な知覚のLab)\nJz或いはCAM16が使われている場合は、マンセル補正が常に無効になります。 +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;作業色空間の色域に色を収め、マンセル補正を行います(均一的な知覚のLab)\nJz或いはCAM16、色の見えと明るさが使われている場合は、マンセル補正が常に無効になります。\n\nデフォルト:マンセル\nマンセル補正:色度が修正された時に、非線形性に起因する色ずれが発生するL*a*b*の欠点を修復します(均一的な知覚Lab)\nL*a*b*: 色域制御、相対的色域が適用され後に、マンセル補正が行われます\nXYZ 絶対:色域制御、絶対的色域が適用された後にマンセル補正が行われます \nXYZ 相対: 色域制御、相対的色域が適用された後にマンセル補正が行われます。結果はLabの場合と同じになりません。 TP_LOCALLAB_AVOIDMUN;マンセル補正だけ TP_LOCALLAB_AVOIDMUN_TOOLTIP;Jz或いはCAM16が使われている場合は、マンセル補正が常に無効になります。 TP_LOCALLAB_AVOIDRAD;ソフトな半径 @@ -2666,7 +2868,7 @@ TP_LOCALLAB_BILATERAL;平滑化フィルタ TP_LOCALLAB_BLACK_EV;ブラックEv TP_LOCALLAB_BLCO;色度だけ TP_LOCALLAB_BLENDMASKCOL;ブレンド -TP_LOCALLAB_BLENDMASKMASK;マスクの輝度の加減 +TP_LOCALLAB_BLENDMASKMASK;マスクの輝度の加減 TP_LOCALLAB_BLENDMASKMASKAB;マスクの色度の加減 TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;スライダーの値が0の場合は作用しません\n元画像にマスクを追加したり、追加したマスクを削除します TP_LOCALLAB_BLENDMASK_TOOLTIP;ブレンド=0の場合は、形状検出だけが改善します\nブレンドが0より大きい場合は、画像にマスクが追加されます。 ブレンドが0より小さい場合は、画像からマスクが除かれます。 @@ -2676,16 +2878,16 @@ TP_LOCALLAB_BLLC;輝度と色度 TP_LOCALLAB_BLLO;輝度だけ TP_LOCALLAB_BLMED;メディアン TP_LOCALLAB_BLMETHOD_TOOLTIP;通常:全ての設定に対し、直接的なぼかしとノイズ処理\nインバース:ぼかしとノイズ処理\n注意:設定によっては予期しない結果になることがあります -TP_LOCALLAB_BLNOI_EXP;ぼかし & ノイズ除去 +TP_LOCALLAB_BLNOI_EXP;ぼかし & ノイズ TP_LOCALLAB_BLNORM;通常 TP_LOCALLAB_BLUFR;ぼかし/質感とノイズ除去 -TP_LOCALLAB_BLUMETHOD_TOOLTIP;背景をぼかし、前景を区分けするために:\n画像全体をRT-スポットで完全に囲み(スコープと境界値は高くします)背景をぼかします-'通常’或いは’インバース’モードを選択します\n*一つ以上のRT-スポットで’除外’モードを使い、スコープ値を高くして前景を区分けします\n\nこの機能モジュール('メディアン’及び’ガイド付きフィルタ’を含む)は、メインのノイズ低減と併用できます。 +TP_LOCALLAB_BLUMETHOD_TOOLTIP;背景をぼかし、前景を区分けするために:\n画像全体をRT-スポットで完全に囲み(スコープと変移の位置は高くします)背景をぼかします-'通常’或いは’インバース’モードを選択します\n*一つ以上のRT-スポットで’除外’モードを使い、スコープ値を高くして前景を区分けします\n\nこの機能モジュール('メディアン’及び’ガイド付きフィルタ’を含む)は、メインのノイズ低減と併用できます。 TP_LOCALLAB_BLUR;ガウスぼかし - ノイズ - 質感 TP_LOCALLAB_BLURCOL;半径 TP_LOCALLAB_BLURCOLDE_TOOLTIP;孤立したピクセルが計算に入るの避けるため、ΔEを計算するために使われる画像に少しぼかしをかけます TP_LOCALLAB_BLURDE;形状検出のぼかし TP_LOCALLAB_BLURLC;輝度だけ -TP_LOCALLAB_BLURLEVELFRA;レベルのぼかし +TP_LOCALLAB_BLURLEVELFRA;詳細レベルのぼかし TP_LOCALLAB_BLURMASK_TOOLTIP;マスクを生成するために半径の大きなぼかしを使います。これにより画像のコントラストを変えたり、画像の一部を暗く、又は明るくすることが出来ます。 TP_LOCALLAB_BLURRMASK_TOOLTIP;ガウスぼかしの’半径’を変えることが出来ます(0~1000) TP_LOCALLAB_BLUR_TOOLNAME;ぼかし/質感 & ノイズ除去 @@ -2696,10 +2898,13 @@ TP_LOCALLAB_BUTTON_DEL;削除 TP_LOCALLAB_BUTTON_DUPL;複製 TP_LOCALLAB_BUTTON_REN;名前の変更 TP_LOCALLAB_BUTTON_VIS;表示/非表示 +TP_LOCALLAB_BWEVNONE;なし +TP_LOCALLAB_BWEVSIG;有効 +TP_LOCALLAB_BWEVSIGLOG;シグモイド & 対数符号化 TP_LOCALLAB_BWFORCE;ブラックEvとホワイトEvを使う TP_LOCALLAB_CAM16PQREMAP;HDR PQ(最大輝度) TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;CAM16に適応したPQ (知覚量子化)。これによりPQの内部関数を変えることが出来ます(通常は10000カンデラ毎平方メートル - デフォルトは100カンデラ毎平方メートルですが無効になります\n異なるデバイスや画像を扱う場合に使えます。 -TP_LOCALLAB_CAM16_FRA;CAM16による画像の調整 +TP_LOCALLAB_CAM16_FRA;CAM16による画像編集 TP_LOCALLAB_CAMMODE;CAMのモデル TP_LOCALLAB_CAMMODE_CAM16;CAM16 TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz @@ -2712,12 +2917,14 @@ TP_LOCALLAB_CBDL_TOOLNAME;詳細レベルによるコントラスト調整 TP_LOCALLAB_CENTER_X;センターX TP_LOCALLAB_CENTER_Y;センターY TP_LOCALLAB_CH;CL - LC +TP_LOCALLAB_CHRO46LABEL;詳細レベル4から6の色度: 平均=%1 高=%2 +TP_LOCALLAB_CHROLABEL;詳細レベル0から3の色度: 平均=%1 高=%2 TP_LOCALLAB_CHROMA;色度 -TP_LOCALLAB_CHROMABLU;色度のレベル +TP_LOCALLAB_CHROMABLU;詳細レベルの色度 TP_LOCALLAB_CHROMABLU_TOOLTIP;輝度の設定に応じて、効果を増やしたり減らしたりします\n設定値が1以下の場合は効果が減ります。1より大きいと効果が増えます TP_LOCALLAB_CHROMACBDL;色度 TP_LOCALLAB_CHROMACB_TOOLTIP;輝度の設定に応じて、効果を増やしたり減らしたりします\n設定値が1以下の場合は効果が減ります。1より大きいと効果が増えます -TP_LOCALLAB_CHROMALEV;色度のレベル +TP_LOCALLAB_CHROMALEV;詳細レベルの色度 TP_LOCALLAB_CHROMASKCOL;色度 TP_LOCALLAB_CHROMASK_TOOLTIP;このスライダーを使って背景の彩度を下げることが出来ます(インバースマスクで言う0に近いカーブ).\n色度に対するマスクの作用を強めることも出来ます。 TP_LOCALLAB_CHROML;色度 (C) @@ -2727,19 +2934,25 @@ TP_LOCALLAB_CIEC;色の見えモデルの環境変数を使う TP_LOCALLAB_CIECAMLOG_TOOLTIP;このモジュールはCIE色の見えモデルをベースにしています。このモデルは異なる光源の下で人の目が知覚する色を真似るものです。\n最初の処理は’場面条件’で対数符号化によって実行されます。この際、撮影時の’絶対輝度’が使われます。\n次の処理は単純化した’画像の調整’で3つに絞り込んだ変数(ローカルコントラスト、コントラストJ、彩度S)を使います。\n3つ目の処理は’観視条件’で出力画像を見る条件(モニター、TV、プロジェクター、プリンターなどのこと)を考慮します。この処理により表示媒体に関わらず同じ画像の色やコントラストを維持します。 TP_LOCALLAB_CIECOLORFRA;色 TP_LOCALLAB_CIECONTFRA;コントラスト -TP_LOCALLAB_CIELIGHTCONTFRA;明るさとコントラスト -TP_LOCALLAB_CIELIGHTFRA;明度 -TP_LOCALLAB_CIEMODE;処理過程の位置の変更 +TP_LOCALLAB_CIELIGHTCONTFRA;明るさ & コントラスト +TP_LOCALLAB_CIELIGHTFRA;明るさ +TP_LOCALLAB_CIEMODE;機能の位置変更 TP_LOCALLAB_CIEMODE_COM;デフォルト TP_LOCALLAB_CIEMODE_DR;ダイナミックレンジ TP_LOCALLAB_CIEMODE_TM;トーンマッピング -TP_LOCALLAB_CIEMODE_TOOLTIP;デフォルトではCIECAMが処理過程の最後になっています。"マスクと修正領域"と"輝度マスクをベースにした回復"は"CAM16 + JzCzHz"で使えます。\n好みに併せて他の機能(トーンマッピング、ダイナミックレンジ圧縮、対数符号化)にCIECAMを統合することも出来ます。調整結果はCIECAMを統合しなかった場合と異なります。このモードでは"マスクと修正領域"と"輝度マスクをベースにした回復"が使えます。 +TP_LOCALLAB_CIEMODE_TOOLTIP;デフォルトではCIECAMが処理過程の最後になっています。"マスクと修正"と"輝度マスクをベースにした詳細の復元"は"CAM16 + JzCzHz"で使えます。\n好みに併せて他の機能(トーンマッピング、ダイナミックレンジ圧縮、対数符号化)にCIECAMを統合することも出来ます。調整結果はCIECAMを統合しなかった場合と異なります。このモードでは"マスクと修正"と"輝度マスクをベースにした詳細の復元"が使えます。 TP_LOCALLAB_CIEMODE_WAV;ウェーブレット TP_LOCALLAB_CIETOOLEXP;カーブ +TP_LOCALLAB_CIE_SMOOTHFRAME;ハイライトの減衰とレベル +TP_LOCALLAB_CIE_SMOOTH_EV;Evをベースにした減衰 +TP_LOCALLAB_CIE_SMOOTH_GAMMA;スロープをベースにした減衰 +TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;ガンマをベースにした減衰 +TP_LOCALLAB_CIE_SMOOTH_LEVELS;レベル +TP_LOCALLAB_CIE_SMOOTH_NONE;なし TP_LOCALLAB_CIE_TOOLNAME;色の見えモデル(CAM16とJzCzHz) -TP_LOCALLAB_CIRCRADIUS;スポットの中心の大きさ +TP_LOCALLAB_CIRCRADIUS;スポットの中心円の大きさ TP_LOCALLAB_CIRCRAD_TOOLTIP;この円内の情報がRT-スポットの編集の基準値となります。色相、輝度、色度、Sobelの形状検出に使います。\n小さい半径は花の色などの補正に。\n大きな半径は肌などの補正に適しています。 -TP_LOCALLAB_CLARICRES;色度を融合 +TP_LOCALLAB_CLARICRES;色度の融合 TP_LOCALLAB_CLARIFRA;明瞭とシャープマスク/ブレンド & ソフトイメージ TP_LOCALLAB_CLARIJZ_TOOLTIP;レベル0から4まではシャープマスクが働きます\nレベル5以上では明瞭が働きます TP_LOCALLAB_CLARILRES;輝度の融合 @@ -2748,19 +2961,23 @@ TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;‘ソフトな半径’のスライダー (ガ TP_LOCALLAB_CLARISOFT_TOOLTIP;'ソフトな半径’のスライダーは(ガイド付きフィルタのアルゴリズム)、明瞭とシャープマスク、及び全てのウェーブレットピラミッドの処理に起因するハロと不規則性を軽減します。作用を無効にするには値を0にします。 TP_LOCALLAB_CLARITYML;明瞭 TP_LOCALLAB_CLARI_TOOLTIP;'シャープマスク’はレベル0~4で有効です。\n’明瞭’はレベル5以上で有効です。\n'レベルのダイナミックレンジ圧縮’を利用する場合に役立ちます。 -TP_LOCALLAB_CLIPTM;復元されたデータの切り取り(ゲイン) +TP_LOCALLAB_CLIPTM;復元されたデータの切り詰め(ゲイン) TP_LOCALLAB_COFR;色と明るさ -TP_LOCALLAB_COLORDE;ΔEのプレビューカラー - 強さ -TP_LOCALLAB_COLORDEPREV_TOOLTIP;有効になっている機能が1つだけの時は、設定のパネル(拡張する)のΔEのプレビューボタンを使います。\n複数の機能が有効になっている時は、各機能に備わっているマスクと調節の中のΔEのプレビューを使います。 +TP_LOCALLAB_COLORDE;プレビューΔEのカラー - 強さ +TP_LOCALLAB_COLORDEPREV_TOOLTIP;‘現在のスポットに機能を追加’で選んだ機能の中で、設定パネルで表示される‘プレビューΔEボタン’が使えるのは、シャープニング、ソフトライト&独自のレティネックス、ぼかし/質感&ノイズ除去、霞除去&レティネックス、或いは、詳細レベルによるコントラスト調整だけです。\n他の機能の場合は、その機能パネルの中に表示されるプレビューΔEボタンを使います。また、同じRT-スポットで複数の機能が有効になっている場合は、マスクと修正領域のコンボボックスの中にあるプレビューΔEボタンを使います。 TP_LOCALLAB_COLORDE_TOOLTIP;設定値がマイナスの場合は色差(ΔE)のプレビューの色をブルーで表示、プラスの場合はグリーンで表示\n\nマスクと調節(マスクなしで変更された領域を表示):プラスであれば、実際の変更を表示、マイナスであれば、強化された変更(輝度のみ)をブルーとイエローで表示 +TP_LOCALLAB_COLORFRAME;主体色 TP_LOCALLAB_COLORSCOPE;カラー機能のスコープ TP_LOCALLAB_COLORSCOPE_TOOLTIP;色と明るさ、露光補正(標準)、シャドウ/ハイライト、自然な彩度の機能にはこのスコープを使います。\n他の機能に関しては、それぞれのモジュールに属しているスコープを使います。 TP_LOCALLAB_COLOR_CIE;カラーカーブ TP_LOCALLAB_COLOR_TOOLNAME;色と明るさ TP_LOCALLAB_COL_NAME;名前 TP_LOCALLAB_COL_VIS;ステータス -TP_LOCALLAB_COMPFRA;詳細レベルの方向によるコントラスト +TP_LOCALLAB_COMPFRA;方向によるコントラスト +TP_LOCALLAB_COMPRCIE;明るさの圧縮 +TP_LOCALLAB_COMPRCIETH;圧縮のしきい値 TP_LOCALLAB_COMPREFRA;ウェーブレットのレベルを使ったトーンマッピング +TP_LOCALLAB_COMPRLOG_TOOLTIP;これは、しきい値以上のコントラストで、データを対数変換する前に圧縮するアルゴリズムです。ホワイトの分布と併用して使います。 TP_LOCALLAB_CONTCOL;コントラストしきい値 TP_LOCALLAB_CONTFRA;レベルによるコントラスト調整 TP_LOCALLAB_CONTRAST;コントラスト @@ -2784,6 +3001,7 @@ TP_LOCALLAB_CURVNONE;カーブを無効 TP_LOCALLAB_DARKRETI;暗さ TP_LOCALLAB_DEHAFRA;霞除去 TP_LOCALLAB_DEHAZ;強さ +TP_LOCALLAB_DEHAZE_BLACK;ブラック TP_LOCALLAB_DEHAZFRAME_TOOLTIP;大気に起因する霞を除去します。全体の彩度とディテールが向上します\n色被りも除去できますが、青味がかかることがあるので、その場合は別な機能で補正します TP_LOCALLAB_DEHAZ_TOOLTIP;マイナス値にすると霞が増えます TP_LOCALLAB_DELTAD;デルタバランス @@ -2796,11 +3014,13 @@ TP_LOCALLAB_DENOICHRODET_TOOLTIP;漸進的にフーリエ変換(離散コサ TP_LOCALLAB_DENOICHROF_TOOLTIP;小さいディテールの色ノイズを調整します TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;ブルー/イエロー、或いはレッド/グリーンの補色次元で色ノイズを軽減します TP_LOCALLAB_DENOIEQUAL_TOOLTIP;シャドウ、或いはハイライト部分で、ある程度ノイズ低減を実行出来ます -TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;漸進的にフーリエ変換(離散コサイン変換)を適用することで、輝度のディテールを回復します +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;漸進的にフーリエ変換(離散コサイン変換)を適用することで、輝度のディテールを回復します TP_LOCALLAB_DENOIMASK;色ノイズのマスク TP_LOCALLAB_DENOIMASK_TOOLTIP;全ての機能でマスクの色ノイズの程度を加減することが出来ます。\nLC(h)カーブを使う際、アーティファクトを避けたり、色度をコントロールするのに便利です。 -TP_LOCALLAB_DENOIQUA_TOOLTIP;’控え目’なモードでは、低周波ノイズは除去されません。’積極的’なモードは低周波ノイズも除去します。\n’控え目’も’積極的’も、ウェーブレットとDCTを使いますが、’輝度のノンローカルミーン’を併用することも出来ます。 -TP_LOCALLAB_DENOITHR_TOOLTIP;均一及び低コントラスト部分のノイズを減らす補助としてエッジ検出を調整します +TP_LOCALLAB_DENOIQUA_TOOLTIP;’控え目’なモードでは、低周波ノイズは除去されません。’積極的’なモードは低周波ノイズも除去します。\n’控え目’も’積極的’も、ウェーブレットとDCTを使いますが、’輝度の非局所平均フィルタ’を併用することも出来ます。 +TP_LOCALLAB_DENOITHR_TOOLTIP;均一及び低コントラスト部分のノイズを減らす補助としてエッジ検出を調整します +TP_LOCALLAB_DENOIWAVCH;ウェーブレット: 色ノイズ +TP_LOCALLAB_DENOIWAVLUM;ウェーブレット: 輝度ノイズ TP_LOCALLAB_DENOI_EXP;ノイズ除去 TP_LOCALLAB_DENOI_TOOLTIP;このモジュールは単独のノイズ低減機能(処理工程の最後の方に位置)として、或いはメインのディテールタブに付属するノイズ低減(処理工程の最初の方に位置)の追加機能として使うことが出来ます。\n色(ΔE)を基本に、スコープを使って作用に差を付けることが出来ます。\n但し、RT-スポットは最低128x128の大きさの必要です TP_LOCALLAB_DEPTH;深度 @@ -2808,6 +3028,7 @@ TP_LOCALLAB_DETAIL;ローカルコントラスト TP_LOCALLAB_DETAILFRA;エッジ検出 - DCT TP_LOCALLAB_DETAILSH;ディテール TP_LOCALLAB_DETAILTHR;輝度と色の詳細のしきい値 +TP_LOCALLAB_DISAB_CIECAM;CIECAM、或いは弱いJz状態を無効にする TP_LOCALLAB_DIVGR;ガンマ TP_LOCALLAB_DUPLSPOTNAME;コピー TP_LOCALLAB_EDGFRA;エッジシャープネス @@ -2816,6 +3037,7 @@ TP_LOCALLAB_ELI;楕円 TP_LOCALLAB_ENABLE_AFTER_MASK;トーンマッピングを使う TP_LOCALLAB_ENABLE_MASK;マスクを有効にする TP_LOCALLAB_ENABLE_MASKAFT;露光補正の全てのアルゴリズムを使う +TP_LOCALLAB_ENABLE_MASKALL;全てのマスクツールを有効にする TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;元のデータの代わりに透過マップを使った後は、有効にしたマスクは修復されたデータを使います。 TP_LOCALLAB_ENH;強化 TP_LOCALLAB_ENHDEN;強化 + 色ノイズの軽減 @@ -2831,9 +3053,10 @@ TP_LOCALLAB_EV_VIS_ALL;全て表示 TP_LOCALLAB_EXCLUF;除外 TP_LOCALLAB_EXCLUF_TOOLTIP;’除外’モードはRT-スポットの中に編集の影響を受けたくない部分がある場合、別なRT-スポットで除外モードを選択し、その部分の編集効果を無効にします。’スコープ’を使えば影響を無効にする範囲を調整出来ます\n除外スポットに別な機能を追加することが出来るので、通常スポットの様に使うことも可能です(目標とする効果を無効にして、別な機能の効果を出すような場合) TP_LOCALLAB_EXCLUTYPE;スポットのタイプ -TP_LOCALLAB_EXCLUTYPE_TOOLTIP;通常スポットが使う情報は再帰的になります。\n\n除外スポットはローカル調整のデータを再初期化します。\nそれまでの作用を一部、或いは全てキャンセルするために使います。或いは、インバースモードで動作を実行するために使います。\n\n’画像全体’はローカル編集の機能を画像全体で使うためのモードです。\nRT-スポットのフレーム(外枠)がプレビュー画像の外側に自動で設定されます。\n’境界の階調調節’の境界値が自動で100に設定されます。\n注意1:目標とする調整に応じて、RT-スポットの中心円の位置や大きさを変えます。\n注意2:このスポットタイプでノイズ除去やウェーブレット、或いは高速フーリエ変換を使う場合はメモリー消費量が非常に大きくなります。PCのスペックが低いとプログラムがクラッシュすることがあります。 +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;通常スポットが使う情報は再帰的になります。\n\n除外スポットはローカル調整のデータを再初期化します。\nそれまでの作用を一部、或いは全てキャンセルするために使います。或いは、インバースモードで動作を実行するために使います。\n\n’画像全体’はローカル編集の機能を画像全体で使うためのモードです。\nRT-スポットのフレーム(外枠)がプレビュー画像の外側に自動で設定されます。\n’変移の階調’の変移の位置が自動で100に設定されます。\n注意1:目標とする調整に応じて、RT-スポットの中心円の位置や大きさを変えます。\n注意2:このスポットタイプでノイズ除去やウェーブレット、或いは高速フーリエ変換を使う場合はメモリー消費量が非常に大きくなります。PCのスペックが低いとプログラムがクラッシュすることがあります。\n\n‘グローバル’を選択すると、ΔEと変移の階調に影響を受けずに、画像全体でローカル編集の機能を使うことが出来ます。 TP_LOCALLAB_EXECLU;除外スポット TP_LOCALLAB_EXFULL;画像全体 +TP_LOCALLAB_EXMAIN;グローバル TP_LOCALLAB_EXNORM;通常スポット TP_LOCALLAB_EXPCBDL_TOOLTIP;センサーやレンズの汚れ跡を、それに該当する詳細レベルのコントラストを減らすことで除去します。 TP_LOCALLAB_EXPCHROMA;色度の補間 @@ -2841,22 +3064,22 @@ TP_LOCALLAB_EXPCHROMA_TOOLTIP;色が褪せるのを避けるため、’露光 TP_LOCALLAB_EXPCOLOR_TOOLTIP;色、明度、コントラストの調整に使います。赤目やセンサーの汚れに起因する不良の補正にも使えます。 TP_LOCALLAB_EXPCOMP;露光量補正 ƒ TP_LOCALLAB_EXPCOMPINV;露光量補正 -TP_LOCALLAB_EXPCOMP_TOOLTIP;ポートレート或いは色の階調が少ない画像の場合、’設定’の’形状検出’を調整します:\n\n’ΔEスコープのしきい値’を増やします\n’ΔEの減衰’を減らします\n’バランス ab-L(ΔE)'を増やします +TP_LOCALLAB_EXPCOMP_TOOLTIP;ポートレート或いは色の階調が少ない画像の場合、’設定’の’形状検出’を調整します:\n\n’ΔEスコープのしきい値’を増やします\n’ΔEの減衰’を減らします\n’バランス ab-L(ΔE)'を増やします TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;RawPediaの'ウェーブレットのレベル’を参照して下さい。\nローカル編集のウェーブレットのレベルは異なる部分が幾つかあります:各ディテールのレベルに対する調整機能がより多く、多様性が増します。\n例、ウェーブレットのレベルのトーンマッピングです。 -TP_LOCALLAB_EXPCONTRAST_TOOLTIP;あまりに小さいRT-スポットの設定は避けます(少なくとも32x32ピクセル以上)。\n低い’境界値’と高い’境界の減衰’値、及び’スコープ’値を使い、小さいRT-スポットを真似て欠陥部分を補正します。\nアーティファクトを軽減するために、必要に応じて’ソフトな半径’を調整して ’明瞭とシャープマスク’、’ファイルの融合’を使います。 +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;あまりに小さいRT-スポットの設定は避けます(少なくとも32x32ピクセル以上)。\n低い’変移の位置’と高い’変移の減衰’値、及び’スコープ’値を使い、小さいRT-スポットを真似て欠陥部分を補正します。\nアーティファクトを軽減するために、必要に応じて’ソフトな半径’を調整して ’明瞭とシャープマスク’、’ファイルの融合’を使います。 TP_LOCALLAB_EXPCURV;カーブ TP_LOCALLAB_EXPGRAD;階調フィルタ TP_LOCALLAB_EXPGRADCOL_TOOLTIP;階調フィルタは’色と明るさ’の輝度、色度、色相の階調と、ファイルの融合、'露光補正'の輝度の階調、、'露光補正マスク'の輝度の階調、'シャドウ/ハイライト'の輝度の階調、'自然な彩度'の輝度、色度、色相の階調、’ローカルコントラスト&ウェーブレットピラミッド’のローカルコントラストの階調で使えます。\nフェザー処理は’設定’の中にあります。 TP_LOCALLAB_EXPLAPBAL_TOOLTIP;変化させた画像と元の画像のブレンドを変えます -TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;ラプラス変換前後にガンマカーブを加えて、コントラストが過剰な、或いは不足した画像を修正します -TP_LOCALLAB_EXPLAPLIN_TOOLTIP;ラプラス変換を適用する前に、線形要素を加え、露出不足の画像を修正します +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;ラプラス作用素の前後にガンマ補正を加えて、コントラストが過剰な、或いは不足した画像を修正します +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;ラプラス作用素を適用する前に、線形要素を加え、露出不足の画像を修正します TP_LOCALLAB_EXPLAP_TOOLTIP;スライダーを右に移動すると漸進的にコントラストが減少します TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;不透明度のコントロールで、GIMPやPhotoshop(C)の、Difference, Multiply, Soft Light, Overlayなどのレイヤー融合モードが使えます。\n元画像:現在のRT-スポットと元画像の融合\n前のRT-スポット:現在のRT-スポットと前のRT-スポットを融合(但し、前のスポットがある場合に限る、ない場合は元画像と融合)\n背景:現在のRT-スポットと背景の色と輝度を融合 -TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;アーティファクト(ノイズ)の発生を避けるため、ラプラス変換の前にメディアンフィルタを適用します +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;アーティファクト(ノイズ)の発生を避けるため、ラプラス作用素を適用する前にメディアンフィルタを適用します TP_LOCALLAB_EXPOSE;ダイナミックレンジ & 露光補正 TP_LOCALLAB_EXPOSURE_TOOLTIP;シャドウ部分が強いような場合は、’シャドウ/ハイライト’のモジュールが使えます TP_LOCALLAB_EXPRETITOOLS;高度なレティネックス機能 -TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-スポットの大きさが最低でも39x39ピクセル必要です\nスポットが小さい場合は、低い境界値、高い減衰値、高いスコープ値を設定します +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-スポットの大きさが最低でも39x39ピクセル必要です\nスポットが小さい場合は、低い変移の位置、高い減衰値、高いスコープ値を設定します TP_LOCALLAB_EXPTOOL;露光補正の機能 TP_LOCALLAB_EXP_TOOLNAME;ダイナミックレンジ & 露光補正 TP_LOCALLAB_FATAMOUNT;量 @@ -2865,6 +3088,7 @@ TP_LOCALLAB_FATDETAIL;ディテール TP_LOCALLAB_FATFRA;ダイナミックレンジ圧縮 ƒ TP_LOCALLAB_FATFRAME_TOOLTIP;ここではFattalのトーンマッピングアルゴリズムを使います\nアンカーで画像の露出不足・過多に応じた選択が出来ます\n現在のスポットに近く、マスクを使用する2番目のスポットの輝度を増やすのに便利です TP_LOCALLAB_FATLEVEL;シグマ +TP_LOCALLAB_FATSAT;彩度の抑制 TP_LOCALLAB_FATSHFRA;マスクのダイナミックレンジ圧縮のマスク ƒ TP_LOCALLAB_FEATH_TOOLTIP;RT-スポットの対角線の長さに対する諧調幅の割合で作用します\nこれは階調フィルタを備えているモジュール全てに共通です\n但し、フェザー処理が働くのは、階調フィルタの中で一つ以上の調整が行われている場合だけです TP_LOCALLAB_FEATVALUE;フェザー処理 @@ -2883,11 +3107,16 @@ TP_LOCALLAB_GAMM;ガンマ TP_LOCALLAB_GAMMASKCOL;ガンマ TP_LOCALLAB_GAMMASK_TOOLTIP;ガンマとスロープを調整すると、不連続になるのを避けるために’L’が徐々に変わるため、アーティファクトを発生させずにマスクの修正が出来ます TP_LOCALLAB_GAMSH;ガンマ +TP_LOCALLAB_GAMUTLABRELA;L*a*b* +TP_LOCALLAB_GAMUTMUNSELL;マンセル補正だけ +TP_LOCALLAB_GAMUTNON;なし +TP_LOCALLAB_GAMUTXYZABSO;XYZ 絶対 +TP_LOCALLAB_GAMUTXYZRELA;XYZ 相対 TP_LOCALLAB_GAMW;ガンマ(ウェーブレットピラミッド) TP_LOCALLAB_GRADANG;階調フィルタの角度 TP_LOCALLAB_GRADANG_TOOLTIP;-180度から+180度の間で角度を調整 TP_LOCALLAB_GRADFRA;階調フィルタのマスク -TP_LOCALLAB_GRADGEN_TOOLTIP;階調フィルタの機能は’色と明るさ’と、’露光’、'シャドウ/ハイライト”、’自然な彩度’に備わっています\n\n自然な彩度、色と明るさには輝度、色調、色相の階調フィルタが使えます\nフェザー処理は設定の中にあります +TP_LOCALLAB_GRADGEN_TOOLTIP;階調フィルタの機能は’色と明るさ’と、’露光’、'シャドウ/ハイライト”、’自然な彩度’に備わっています\n\n自然な彩度、色と明るさには輝度、色調、色相の階調フィルタが使えます\nフェザー処理は設定の中にあります TP_LOCALLAB_GRADLOGFRA;輝度の階調フィルタ TP_LOCALLAB_GRADSTR;階調フィルタ 強さ TP_LOCALLAB_GRADSTRAB_TOOLTIP;色度の階調の強さを調整します @@ -2900,7 +3129,7 @@ TP_LOCALLAB_GRAINFRA;フィルムの質感 1:1 TP_LOCALLAB_GRAINFRA2;粗い TP_LOCALLAB_GRAIN_TOOLTIP;画像にフィルムのような質感を加えます TP_LOCALLAB_GRALWFRA;階調フィルタ(ローカルコントラスト) -TP_LOCALLAB_GRIDFRAME_TOOLTIP;このツールはブラシとして使うことが出来ます。小さいRT-スポットと低い‘境界値’、‘境界値の減衰’を設定します。\n‘標準’モードだけで使います。融合する背景(ΔE)に関係するのは色相、彩度、色、輝度です。 +TP_LOCALLAB_GRIDFRAME_TOOLTIP;このツールはブラシとして使うことが出来ます。小さいRT-スポットと低い‘変移の位置’、‘変移の減衰’を設定します。\n‘標準’モードだけで使います。融合する背景(ΔE)に関係するのは色相、彩度、色、輝度です。 TP_LOCALLAB_GRIDMETH_TOOLTIP;カラートーン調整:色が変わる際に輝度を考慮します。グリッド上の’白い点’は0の位置、’黒い点’だけを移動した場合は、H=f(H)と同じ効果です。両方の点を移動した場合に’カラートーン調整’の効果になります。\n\n直接:色度に直接作用します。 TP_LOCALLAB_GRIDONE;カラートーン調整 TP_LOCALLAB_GRIDTWO;直接 @@ -2908,7 +3137,7 @@ TP_LOCALLAB_GUIDBL;ソフトな半径 TP_LOCALLAB_GUIDBL_TOOLTIP;半径を変えられるガイド付きフィルタを適用します。アーティファクトを軽減したり、画像にぼかしを掛けたり出来ます。 TP_LOCALLAB_GUIDEPSBL_TOOLTIP;ガイド付きフィルタの配分機能を変化させます。マイナス値の設定はガウスぼかしに似た効果となります TP_LOCALLAB_GUIDFILTER;ガイド付きフィルタの半径 -TP_LOCALLAB_GUIDFILTER_TOOLTIP;アーティファクトが減ったり、増えたりします +TP_LOCALLAB_GUIDFILTER_TOOLTIP;アーティファクトが減ったり、増えたりします TP_LOCALLAB_GUIDSTRBL_TOOLTIP;ガイド付きフィルタの強さ TP_LOCALLAB_HHMASK_TOOLTIP;例えば肌の微妙な色相調整に使います TP_LOCALLAB_HIGHMASKCOL;ハイライト @@ -2945,8 +3174,8 @@ TP_LOCALLAB_JZLOGWB_TOOLTIP;自動を有効にすると、スポット内のEv TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Ybは背景の平均輝度を指し、グレーの割合(%)で表します。グレー18%は背景のCIE Labの輝度値が50%であることと同じです。\nデータは画像の平均輝度に基づいています\n対数符号化が使われている場合は、対数符号化が行われる前に適用するゲインの量を決めるために平均輝度が使われます。平均輝度の値が低い程、ゲインが増えます。 TP_LOCALLAB_JZMODECAM_TOOLTIP;Jzが使えるのは機能水準が'高度'な場合だけです。Jzが機能するのは出力デバイス(モニター)がHDRの場合だけです(最大出力輝度が100カンデラ毎平方メートル以上、理想的には4000から10000カンデラ毎平方メートル、ブラックポイントが0.005カンデラ毎平方メートル以下のモニターです)。ここで想定されるのは、a)モニターのICCのプロファイル接続色空間でJzazbz (或いはXYZ)が使える、b)実数精度で作業出来る、c)モニターがキャリブレートされている(出来れば、DCI-P3、或いはRec-2020の色域で)、d) 通常のガンマ(sRGB、或いはBT709)が知覚量子化の関数で置き換えられる、ことです。 TP_LOCALLAB_JZPQFRA;Jz 再マッピング -TP_LOCALLAB_JZPQFRA_TOOLTIP;Jzのアルゴリズムを以下の様にSDR(標準ダイナミックレンジ)の環境、或いはHDR(ハイダイナミックレンジ)の環境の特性に対して適応させることが出来ます:\n a) 輝度値が0から100カンデラ毎平方メートルの間では、システムがSDRであるように作用する\n b) 輝度値が100から10000カンデラ毎平方メートルの間では、画像とモニターのHDR特性にJzのアルゴリズムを適応させる。\n\n“PQ - 最大輝度P”を10000カンデラ毎平方メートルに設定すると、“Jzの再マッピング”がJzazbzのオリジナルアルゴリズムの特性を示します。 -TP_LOCALLAB_JZPQREMAP;PQ - 最大輝度 +TP_LOCALLAB_JZPQFRA_TOOLTIP;Jzのアルゴリズムを以下の様にSDR(標準ダイナミックレンジ)の環境、或いはHDR(ハイダイナミックレンジ)の環境の特性に対して適応させることが出来ます:\n a) 輝度値が0から100カンデラ毎平方メートルの間では、システムがSDRであるように作用する\n b) 輝度値が100から10000カンデラ毎平方メートルの間では、画像とモニターのHDR特性にJzのアルゴリズムを適応させる。\n\n“PQ - 最大輝度P”を10000カンデラ毎平方メートルに設定すると、“Jzの再マッピング”がJzazbzのオリジナルアルゴリズムの特性を示します。 +TP_LOCALLAB_JZPQREMAP;PQ - 最大輝度 TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (知覚量子化) - PQの内部関数を変えることが出来ます。デフォルトでは120カンデラ毎平方メートルが設定されていますが、一般的な10000カンデラ毎平方メートルに変えられます。\n異なる画像、処理、デバイスに適応させるために使います。 TP_LOCALLAB_JZQTOJ;相対輝度 TP_LOCALLAB_JZQTOJ_TOOLTIP;"絶対輝度"の代わりに"相対輝度"が使えるようになります - 明るさが明度で表現されるようになります。\n変更により、明るさとコントラストのスライダー、及びJz(Jz)カーブが影響を受けます。 @@ -2958,25 +3187,27 @@ TP_LOCALLAB_JZTARGET_EV;観視の平均輝度(Yb%) TP_LOCALLAB_JZTHRHCIE;Jz(Hz)の色度のしきい値 TP_LOCALLAB_JZWAVEXP;Jz ウェーブレット TP_LOCALLAB_LABBLURM;マスクのぼかし -TP_LOCALLAB_LABEL;ローカル編集 +TP_LOCALLAB_LABEL;選択的な編集 TP_LOCALLAB_LABGRID;カラー補正グリッド TP_LOCALLAB_LABGRIDMERG;背景 TP_LOCALLAB_LABGRID_VALUES;高(a)=%1 高(b)=%2\n低(a)=%3 低(b)=%4 TP_LOCALLAB_LABSTRUM;構造マスク -TP_LOCALLAB_LAPLACC;ΔØ マスク ラプラス変換 PDEの境界条件あり -TP_LOCALLAB_LAPLACE;ラプラス変換のしきい値 ΔE -TP_LOCALLAB_LAPLACEXP;ラプラス変換のしきい値 -TP_LOCALLAB_LAPMASKCOL;ラプラス変換のしきい値 +TP_LOCALLAB_LAPLACC;ΔØ マスク ラプラシアン PDEの境界条件あり +TP_LOCALLAB_LAPLACE;ラプラシアンのしきい値 ΔE +TP_LOCALLAB_LAPLACEXP;ラプラシアンのしきい値 +TP_LOCALLAB_LAPMASKCOL;ラプラシアンのしきい値 TP_LOCALLAB_LAPRAD1_TOOLTIP;明るい領域の輝度値を上げることでマスクのコントラストを増やします。 TP_LOCALLAB_LAPRAD2_TOOLTIP;スムーズな半径はアーティファクトを軽減し、境界を滑らかにするためにガイド付きフィルタを使います。 TP_LOCALLAB_LAPRAD_TOOLTIP;スムーズな半径はガイド付きフィルタを使ってアーティファクトを減らし、境界をスムーズにします。 -TP_LOCALLAB_LAP_MASK_TOOLTIP;全てのラプラシアンマスクのポアソン方程式の解を求めます\nラプラシアンのしきい値マスクを有効にするとアーティファクトが軽減され、スムーズな効果が得られます\n無効の場合は線形的な応答となります +TP_LOCALLAB_LAP_MASK_TOOLTIP;全てのラプラシアンマスクのポアソン方程式の解を求めます\nラプラシアンのしきい値マスクを有効にするとアーティファクトが軽減され、スムーズな効果が得られます\n無効の場合は線形的な応答となります +TP_LOCALLAB_LCLABELS;残差画像のノイズレベル +TP_LOCALLAB_LCLABELS_TOOLTIP;プレビューパネル(拡大率100%)で表示されている部分のノイズの平均値と最も高い値を表示します。ノイズの値は0から3、4から5のウェーブレットのレベルでグループ化されています。\n表示される値はあくまで目安であり、ノイズ除去の補助的役割を担うものです。絶対的なノイズの値ではありません。\n\n300:非常にノイズが多い\n100から300:ノイズが多い\n50から100:ある程度のノイズ\n50より低い:ノイズが少ない\n\nこれらの値から次のことが分かります:\n*ディテールタブのノイズ低減機能の効果\n*非局所平均、ウェーブレット、DCT(コサイン変換)機能による輝度ノイズ低減の効果\n*キャプチャーシャープニングとデモザイク処理の効果 TP_LOCALLAB_LC_FFTW_TOOLTIP;高速フーリエ変換を使うと質が向上し、大きな半径も使えますが、処理時間が増えます(処理する領域次第で)。大きい半径を使う時だけに使う方がいいでしょう。FFTWの最適化を図るため、処理する領域が数ピクセルほど小さくなります。これだけで、処理の効率がが1.5倍~10倍良くなります。 TP_LOCALLAB_LC_TOOLNAME;ローカルコントラスト & ウェーブレット -TP_LOCALLAB_LEVELBLUR;ぼかしを施すレベルの最大値 +TP_LOCALLAB_LEVELBLUR;ぼかし効果の強さ TP_LOCALLAB_LEVELWAV;ウェーブレットのレベル TP_LOCALLAB_LEVELWAV_TOOLTIP;詳細レベルの番手はスポットとプレビューのサイズに応じて自動で決まります\n最大512ピクセルで解析するレベル9から最大4ピクセルで解析するレベル1まで -TP_LOCALLAB_LEVFRA;レベル +TP_LOCALLAB_LEVFRA;ウェーブレットのレベル TP_LOCALLAB_LIGHTNESS;明度 TP_LOCALLAB_LIGHTN_TOOLTIP;インバースモードにして、スコープを高く(75以上)、明度を-100にして色度を下げると、境界の外側の輝度が0になります。 TP_LOCALLAB_LIGHTRETI;明度 @@ -2993,7 +3224,7 @@ TP_LOCALLAB_LOC_CONTRASTPYR2LAB;レベルによるコントラスト調整/ト TP_LOCALLAB_LOC_CONTRASTPYRLAB;階調フィルタ/エッジシャープネス/ぼかし TP_LOCALLAB_LOC_RESIDPYR;残差画像 メイン TP_LOCALLAB_LOG;対数符号化 -TP_LOCALLAB_LOG1FRA;CAM16による画像の調整 +TP_LOCALLAB_LOG1FRA;CAM16による画像編集 TP_LOCALLAB_LOG2FRA;観視条件 TP_LOCALLAB_LOGAUTO;自動 TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;場面条件の’平均輝度’を自動で計算します。 @@ -3001,7 +3232,9 @@ TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;相対的な露光レベルの中の’自動’ TP_LOCALLAB_LOGAUTO_TOOLTIP;'自動平均輝度(Yb%)'のオプションが有効になっている時に、このボタンを押すと撮影画像の環境に関する’ダイナミックレンジ’と’平均輝度’が計算されます。\nまた、撮影時の絶対輝度も計算されます。\n再度ボタンを押すと自動的にこれら値が調整されます。 TP_LOCALLAB_LOGBASE_TOOLTIP;デフォルト値は2です\n2以下ではアルゴリズムの働きが弱まり、シャドウ部分が暗く、ハイライト部分が明るくなります\n2より大きい場合は、シャドウ部分が濃いグレーに変わり、ハイライト部分は白っぽくなります TP_LOCALLAB_LOGCATAD_TOOLTIP;色順応とは時空環境に応じて色を認識する能力です。\n光源がD50から大きく外れている場合のホワイトバランス調整に有用です\nこの機能で、出力デバイスの光源の下で同じ色になるように近づけます。 -TP_LOCALLAB_LOGCIE;シグモイドの代わりに対数符号化を使う +TP_LOCALLAB_LOGCIE;対数符号化 +TP_LOCALLAB_LOGCIEQ;対数符号化 Q (CIECAMを含む) +TP_LOCALLAB_LOGCIEQ_TOOLTIP;このオプションを有効(✓)にすると、3つのRGBチャンネルをベースにした対数符号化をCIECAMの明るさ(Q)チャンネルだけをベースにした対数符号化に切り替えることが出来ます。\nRGBチャンネルの代わりにQチャンネルを使うと、色相や彩度のズレによる好ましくないエッジ効果を避けることが出来ます。\n但し、Qチャンネルの値には制限がありませんが、CIECAMは周囲環境や同時対比などに合わせてデータを変化させるため、最適化を図る設定は難しくなります。\n次のような機能調整が必要でしょう:\n‘場面条件’の平均輝度(Yb)、ホワイトとブラックの分布、ブラックEv、ホワイトEv\n‘元データの調整’の明るさの圧縮、強さ\n\n注意:対数符号化(Q)を使う際には、場面条件の周囲環境でCIECAMを無効にするオプションは選択しないようにします。 TP_LOCALLAB_LOGCIE_TOOLTIP;対数符号化Qを使うトーンマッピングでは、ブラックEvとホワイトEvの調節、場面条件の平均輝度と観視条件の平均輝度(Y%)の調整が出来ます。 TP_LOCALLAB_LOGCOLORFL;鮮やかさ (M) TP_LOCALLAB_LOGCOLORF_TOOLTIP;グレーに対して知覚される色相の量のことです。\n色刺激が多かれ少なかれ色付いて見えることの指標です。 @@ -3018,11 +3251,12 @@ TP_LOCALLAB_LOGFRA;場面条件 TP_LOCALLAB_LOGFRAME_TOOLTIP;RT-スポットに関する露出のレベルと’平均輝度 Yb%'(グレーポイントの情報源)を計算し調整します。結果は全てのLab関連処理と殆どのRGB関連処理に使われます。\nまた、場面の絶対輝度も考慮します。 TP_LOCALLAB_LOGIMAGE_TOOLTIP;対応する色の見えモデルの変数(例えば、コントラストJと彩度S、及び機能水準が高度な場合の、コントラストQ、明るさQ、明度J、鮮やかさM)を考慮します。 TP_LOCALLAB_LOGLIGHTL;明度 (J) -TP_LOCALLAB_LOGLIGHTL_TOOLTIP;L*a*b*の明度に近いものですが、知覚される彩色の増加を考慮ています。 +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;L*a*b*の明度に近いものですが、知覚される彩色の増加を考慮ています。 TP_LOCALLAB_LOGLIGHTQ;明るさ (Q) -TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;その色刺激から発せられる知覚された光の量を意味します。\nその色刺激の明るさの多寡の指標です。 +TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;その色刺激から発せられる知覚された光の量を意味します。\nその色刺激の明るさの多寡の指標です。 TP_LOCALLAB_LOGLIN;対数モード TP_LOCALLAB_LOGPFRA;相対的な露光レベル +TP_LOCALLAB_LOGPFRA2;対数符号化の設定 TP_LOCALLAB_LOGREPART;全体の強さ TP_LOCALLAB_LOGREPART_TOOLTIP;元画像と比べた対数符号化した画像の強さを調整します。\n色の見えモデルの構成要素には影響しません。 TP_LOCALLAB_LOGSATURL_TOOLTIP;色の見えモデル16の彩度Sは、物体自身が持つ明るさに関した色刺激の色に該当します\n主に、中間トーンからハイライトにかけて作用します。 @@ -3031,14 +3265,16 @@ TP_LOCALLAB_LOGSURSOUR_TOOLTIP;場面条件を考慮して明暗と色を調整 TP_LOCALLAB_LOGVIEWING_TOOLTIP;最終画像を見る周囲環境同様、それを見る媒体(モニター、TV、プロジェクター、プリンターなど)に対応します。 TP_LOCALLAB_LOG_TOOLNAME;対数符号化 TP_LOCALLAB_LUM;LL - CC +TP_LOCALLAB_LUM46LABEL;4から6のレベルの輝度: 平均=%1 高=%2 TP_LOCALLAB_LUMADARKEST;最も暗い部分 TP_LOCALLAB_LUMASK;マスクの背景色と輝度 -TP_LOCALLAB_LUMASK_TOOLTIP;マスクの表示(マスクと修正領域)で、背景のグレーを調節します +TP_LOCALLAB_LUMASK_TOOLTIP;マスクの表示(マスクと修正)で、背景のグレーを調節します TP_LOCALLAB_LUMAWHITESEST;最も明るい部分 TP_LOCALLAB_LUMFRA;L*a*b* 標準 +TP_LOCALLAB_LUMLABEL;0から3のレベルの輝度: 平均=%1 高=%2 TP_LOCALLAB_MASFRAME;マスクと融合に関する設定 TP_LOCALLAB_MASFRAME_TOOLTIP;これは全てのマスクに共通します\n以下のマスク機能が使われた時に目標とする領域が変化するのを避けるためにΔE画像を考慮します:ガンマ、スロープ、色度、コントラストカーブ(ウェーブレットのレベル)、ぼかしマスク、構造のマスク(有効になっている場合)\nこの機能はインバースモードでは無効になります -TP_LOCALLAB_MASK;カーブ +TP_LOCALLAB_MASK;コントラスト TP_LOCALLAB_MASK2;コントラストカーブ TP_LOCALLAB_MASKCOM;共通のカラーマスク TP_LOCALLAB_MASKCOM_TOOLNAME;共通のカラーマスク @@ -3047,51 +3283,51 @@ TP_LOCALLAB_MASKCURVE_TOOLTIP;デフォルトでは3つのカーブは1(最大 TP_LOCALLAB_MASKDDECAY;減衰の強さ TP_LOCALLAB_MASKDECAY_TOOLTIP;マスクのグレーレベルの減衰の度合いをコントロールします\n 1は線形で減衰、 1より大きい場合はパラボリック、1より小さい場合はより緩やかな減衰になります TP_LOCALLAB_MASKDEINV_TOOLTIP;マスクを解析するアルゴリズムが反対の作用になります\n ✔を入れると暗い部分と非常に明るい部分が減ります -TP_LOCALLAB_MASKDE_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、ノイズ除去を目的として使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n マスクが'暗い'しきい値より暗い場合は、ノイズ除去が漸進的に作用します\n マスクが'明るい'しきい値より明るい場合は、ノイズ除去が漸進的に作用します\n マスクの明るさが2つのしきい値の間になっている場合は、グレー領域の'輝度ノイズ除去'、或いは'色ノイズ除去'を使ってない限り、ノイズ除去を除く画像の設定が維持されます -TP_LOCALLAB_MASKGF_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、ガイド付きフィルタを目的として使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n マスクが'暗い'しきい値より暗い場合は、階調調整が漸進的に作用します\n マスクが'明るい'しきい値より明るい場合は、ガイド付きフィルタが漸進的に作用します\n マスクの明るさが2つのしきい値の間になっている場合は、ガイド付きフィルタを除いた画像の設定が維持されます +TP_LOCALLAB_MASKDE_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、ノイズ除去を目的として使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n マスクが'暗い'しきい値より暗い場合は、ノイズ除去が漸進的に作用します\n マスクが'明るい'しきい値より明るい場合は、ノイズ除去が漸進的に作用します\n マスクの明るさが2つのしきい値の間になっている場合は、グレー領域の'輝度ノイズ除去'、或いは'色ノイズ除去'を使ってない限り、ノイズ除去を除く画像の設定が維持されます +TP_LOCALLAB_MASKGF_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、ガイド付きフィルタを目的として使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n マスクが'暗い'しきい値より暗い場合は、階調調整が漸進的に作用します\n マスクが'明るい'しきい値より明るい場合は、ガイド付きフィルタが漸進的に作用します\n マスクの明るさが2つのしきい値の間になっている場合は、ガイド付きフィルタを除いた画像の設定が維持されます TP_LOCALLAB_MASKH;色相のカーブ -TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;このしきい値より明るい部分では、”CBDL(輝度のみ)”のパラメータが調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ノイズ除去は100%から漸進的に減少します。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;このしきい値より明るい部分では、”レティネックス(輝度のみ)”のパラメータが調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;このしきい値より明るい部分では、画像が“トーンマッピング”の調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKHIGTHRES_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ガイド付きフィルタは100%から漸進的に減少します。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;このしきい値より明るい部分では、”CBDL(輝度のみ)”のパラメータが調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ノイズ除去は100%から漸進的に減少します。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;このしきい値より明るい部分では、”レティネックス(輝度のみ)”のパラメータが調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;このしきい値より明るい部分では、画像が“トーンマッピング”の調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRES_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ガイド付きフィルタは100%から漸進的に減少します。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 TP_LOCALLAB_MASKLCTHR;明るい領域の輝度のしきい値 TP_LOCALLAB_MASKLCTHR2;明るい領域の輝度のしきい値 TP_LOCALLAB_MASKLCTHRLOW;暗い領域の輝度のしきい値 TP_LOCALLAB_MASKLCTHRLOW2;暗い領域の輝度のしきい値 TP_LOCALLAB_MASKLCTHRMID;グレー領域の輝度ノイズ除去 TP_LOCALLAB_MASKLCTHRMIDCH;グレー領域の色ノイズ除去 -TP_LOCALLAB_MASKLC_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、ノイズ除去を目的として使います。\nこの機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n'暗い部分と明るい部分のノイズ除去強化'のスライダーの値が1より大きい場合、'暗い領域の輝度のしきい値'で設定されたしきい値を0%、最も暗い値(マスクによって定義される)を100%として、ノイズ除去が漸進的に増加します。\n明るい部分では、'明るい領域の輝度のしきい値'で設定されたしきい値を0%、最も明るい値(マスクによって定義される)を100%として、ノイズ除去が漸進的に減衰します。\n2つのしきい値の間の部分では、ノイズ除去の設定はマスクによる影響を受けません。 -TP_LOCALLAB_MASKLNOISELOW;暗い部分と明るい部分のノイズ除去強化 -TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;このしきい値より明るい部分では、画像が'CBDL(輝度のみ)'のパラメータ調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ノイズ除去は100%から漸進的に増加します。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;このしきい値より明るい部分では、画像が'レティネックス'(輝度のみ)のパラメータ調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ガイド付きフィルタは100%から漸進的に増加します。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 -TP_LOCALLAB_MASKRECOL_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”色と明るさ”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'色と明るさ'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'色と明るさ'の設定値が100%適用されます。 +TP_LOCALLAB_MASKLC_TOOLTIP;輝度ノイズをウェーブレットを使って除去します。\n'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、ノイズ除去を目的として使います。\nこの機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n'暗い/明るい領域での補助'のスライダーの値が1より大きい場合、'暗い領域の輝度のしきい値'で設定されたしきい値を0%、最も暗い値(マスクによって定義される)を100%として、ノイズ除去が漸進的に増加します。\n明るい部分では、'明るい領域の輝度のしきい値'で設定されたしきい値を0%、最も明るい値(マスクによって定義される)を100%として、ノイズ除去が漸進的に減衰します。\n2つのしきい値の間の部分では、ノイズ除去の設定はマスクによる影響を受けません。 +TP_LOCALLAB_MASKLNOISELOW;暗い/明るい領域での補助 +TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;このしきい値より明るい部分では、画像が'CBDL(輝度のみ)'のパラメータ調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ノイズ除去は100%から漸進的に増加します。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;このしきい値より明るい部分では、画像が'レティネックス'(輝度のみ)のパラメータ調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ガイド付きフィルタは100%から漸進的に増加します。\n 'マスクと修正'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKRECOL_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”色と明るさ”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'色と明るさ'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'色と明るさ'の設定値が100%適用されます。 TP_LOCALLAB_MASKRECOTHRES;復元のしきい値 -TP_LOCALLAB_MASKREEXP_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている、輝度情報をベースに、“ダイナミックレンジと露光補正”の設定による効果を和らげます。\n この機能を使うためには、L(L)マスクやLC(H)マスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'ダイナミックレンジと露光補正'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'ダイナミックレンジと露光補正'の設定が100%働きます。 -TP_LOCALLAB_MASKRELOG_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている、画像の輝度情報をベースにした“対数符号化”の効果を和らげます。\n この機能を使うためには、L(L)マスクやLC(H)マスクを有効にしておかなくてはなりません。\n 暗い領域のしきい値より暗い部分、と明るい領域のしきい値より明るい部分では、'対数符号化'による調整が働く前の元画像の状態に漸進的に復元されます。色の波及を使ったハイライト復元の効果を維持するために使えます。\n 2つのしきい値の間の部分では、'対数符号化'の設定が100%働きます。 -TP_LOCALLAB_MASKRESCB_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”CBDL”(輝度のみ)の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'CBDL'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'CBDL'の設定値が100%適用されます。 -TP_LOCALLAB_MASKRESH_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”シャドウ/ハイライト”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'シャドウ/ハイライト'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'シャドウ/ハイライト'の設定値が100%適用されます。 -TP_LOCALLAB_MASKRESRETI_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”レティネックス”(輝度のみ)の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'レティネックス'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'レティネックス'の設定値が100%適用されます。 -TP_LOCALLAB_MASKRESTM_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”トーンマッピング”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'トーンマッピング'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'トーンマッピング'の設定値が100%適用されます。 -TP_LOCALLAB_MASKRESVIB_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”自然な彩度 ウォームとクール”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'自然な彩度 ウォームとクール'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'自然な彩度 ウォームとクール'の設定値が100%適用されます。 -TP_LOCALLAB_MASKRESWAV_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”ローカルコントラスト ウェーブレット”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'ローカルコントラスト ウェーブレット'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'ローカルコントラスト ウェーブレット'の設定値が100%適用されます。 -TP_LOCALLAB_MASKUNUSABLE;'マスクと修正領域'のマスクが無効 -TP_LOCALLAB_MASKUSABLE;'マスクと修正領域'のマスクが有効 +TP_LOCALLAB_MASKREEXP_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている、輝度情報をベースに、“ダイナミックレンジと露光補正”の設定による効果を和らげます。\n この機能を使うためには、L(L)マスクやLC(H)マスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'ダイナミックレンジと露光補正'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'ダイナミックレンジと露光補正'の設定が100%働きます。 +TP_LOCALLAB_MASKRELOG_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている、画像の輝度情報をベースにした“対数符号化”の効果を和らげます。\n この機能を使うためには、L(L)マスクやLC(H)マスクを有効にしておかなくてはなりません。\n 暗い領域のしきい値より暗い部分、と明るい領域のしきい値より明るい部分では、'対数符号化'による調整が働く前の元画像の状態に漸進的に復元されます。色の波及を使ったハイライト復元の効果を維持するために使えます。\n 2つのしきい値の間の部分では、'対数符号化'の設定が100%働きます。 +TP_LOCALLAB_MASKRESCB_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”CBDL”(輝度のみ)の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'CBDL'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'CBDL'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESH_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”シャドウ/ハイライト”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'シャドウ/ハイライト'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'シャドウ/ハイライト'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESRETI_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”レティネックス”(輝度のみ)の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'レティネックス'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'レティネックス'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESTM_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”トーンマッピング”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'トーンマッピング'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'トーンマッピング'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESVIB_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”自然な彩度 ウォームとクール”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'自然な彩度 ウォームとクール'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'自然な彩度 ウォームとクール'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESWAV_TOOLTIP;'マスクと修正'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”ローカルコントラスト ウェーブレット”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'ローカルコントラスト ウェーブレット'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'ローカルコントラスト ウェーブレット'の設定値が100%適用されます。 +TP_LOCALLAB_MASKUNUSABLE;'マスクと修正'のマスクが無効 +TP_LOCALLAB_MASKUSABLE;'マスクと修正'のマスクが有効 TP_LOCALLAB_MASK_TOOLTIP;一つの機能の中で複数のマスクを活用することが出来ます。他の機能を有効にしてそのマスクだけを使います(機能の中のスライダー値は全て0にする)。\n\nまたは、RT-スポットを複製し、初めのスポットの近くに置き、そのRT-スポットのマスクを使います。この場合、調整のための基準値の違いが小さいため、より精緻な調整が可能です。 TP_LOCALLAB_MEDIAN;メディアン 低 TP_LOCALLAB_MEDIANITER_TOOLTIP;メディアンフィルタ適用の繰り返し回数を設定します @@ -3103,7 +3339,7 @@ TP_LOCALLAB_MERELE;明るくするだけ TP_LOCALLAB_MERFIV;追加 TP_LOCALLAB_MERFOR;色の覆い焼き TP_LOCALLAB_MERFOU;乗算 -TP_LOCALLAB_MERGE1COLFRA;融合するファイルの選択:オリジナル/前のRT-スポット/背景 +TP_LOCALLAB_MERGE1COLFRA;融合するファイルの選択:元画像/一つ前の画像/背景 TP_LOCALLAB_MERGECOLFRA;マスク:LChと構造 TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;LChの3つのカーブ、或いは構造検出のアルゴリズム、またはその両方をベースにマスクを作ります TP_LOCALLAB_MERGEMER_TOOLTIP;ファイルを癒合する際にΔEを考慮します(この場合はスコープと同じ働きです) @@ -3125,38 +3361,39 @@ TP_LOCALLAB_MERTHI;色の焼き込み TP_LOCALLAB_MERTHR;差異 TP_LOCALLAB_MERTWE;除外 TP_LOCALLAB_MERTWO;減算 -TP_LOCALLAB_METHOD_TOOLTIP;'強化 + 色ノイズ低減'を選ぶと処理時間が著しく増加します\nしかし、アーティファクトは軽減されます +TP_LOCALLAB_METHOD_TOOLTIP;'強化 + 色ノイズ低減'を選ぶと処理時間が著しく増加します\nしかし、アーティファクトは軽減されます +TP_LOCALLAB_MIDTCIE;中間トーン TP_LOCALLAB_MLABEL;復元されたデータ 最小値=%1 最大値=%2 TP_LOCALLAB_MLABEL_TOOLTIP;最低値を0、最大値を32768(対数モード)に近づける必要がありますが、必ずしも一致させる必要はありません。標準化のために、'ゲイン'と'オフセット'を調整します\nブレンドせずに画像を回復します TP_LOCALLAB_MODE_EXPERT;高度 TP_LOCALLAB_MODE_NORMAL;標準 TP_LOCALLAB_MODE_SIMPLE;基本 TP_LOCALLAB_MRFIV;背景 -TP_LOCALLAB_MRFOU;前のRT-スポット +TP_LOCALLAB_MRFOU;一つ前のスポット TP_LOCALLAB_MRONE;なし -TP_LOCALLAB_MRTHR;オリジナルRT-スポット -TP_LOCALLAB_MULTIPL_TOOLTIP;トーンの幅が広い画像、-18EV~+4EV、を調整します: 最初のスライダーは-18EV~-6EVの非常に暗い部分に作用します。2つ目のスライダーは-6EV~+4EVの部分に作用します +TP_LOCALLAB_MRTHR;元画像 +TP_LOCALLAB_MULTIPL_TOOLTIP;トーンの幅が広い画像、-18EV~+4EV、を調整します: 最初のスライダーは-18EV~-6EVの非常に暗い部分に作用します。2つ目のスライダーは-6EV~+4EVの部分に作用します TP_LOCALLAB_NEIGH;半径 TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;値を低くすると詳細と質感が保たれます。高くするとノイズ除去が強まります。\nガンマが3.0の場合は輝度ノイズの除去には線形が使われます。 TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;処理対象の大きさに対して適用するノイズ除去の量を調節するスライダーです。 TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;値を高くするとノイズ除去が強まりますが、その分処理時間が増えます。 TP_LOCALLAB_NLDENOISE_TOOLTIP;'ディテールの復元'はラプラス変換に作用します。詳細を含んだ部分より、むしろ均質な部分を目標にします。 TP_LOCALLAB_NLDET;ディテールの復元 -TP_LOCALLAB_NLFRA;輝度のノンローカルミーンフィルタ -TP_LOCALLAB_NLFRAME_TOOLTIP;ノンローカルミーンフィルタによるノイズ除去は画像の全ピクセルの平均値を使い、その平均値との類似性に応じて、目標ピクセルのノイズ除去に重みを付けます。\nローカルミーンフィルタに比べ、詳細の損失が少なくて済みます。\n輝度ノイズだけを考慮します。色ノイズの除去はウェーブレットとフーリエ変換(DCT)を使う方がベターだからです。\nこのフィルタは単独でも、或いは”詳細レベルによる輝度ノイズの除去”と併用しても使えます。 +TP_LOCALLAB_NLFRA;非局所平均フィルタ:輝度ノイズ +TP_LOCALLAB_NLFRAME_TOOLTIP;非局所平均フィルタによるノイズ除去は画像の全ピクセルの平均値を使い、その平均値との類似性に応じて、目標ピクセルのノイズ除去に重みを付けます。\nローカルミーンフィルタに比べ、詳細の損失が少なくて済みます。\n輝度ノイズだけを考慮します。色ノイズの除去はウェーブレットとフーリエ変換(DCT)を使う方がベターだからです。\nこのフィルタは単独でも、或いは”詳細レベルによる輝度ノイズの除去”と併用しても使えます。 TP_LOCALLAB_NLGAM;ガンマ TP_LOCALLAB_NLLUM;強さ TP_LOCALLAB_NLPAT;パッチの最大値 TP_LOCALLAB_NLRAD;半径の最大値 -TP_LOCALLAB_NOISECHROCOARSE;高い番手の色度(ウェーブレット) +TP_LOCALLAB_NOISECHROCOARSE;高い番手の色ノイズ(ウェーブレット) TP_LOCALLAB_NOISECHROC_TOOLTIP;0より大きい値で効果の高いアルゴリズムが働き始めます\n大まかなスライダーの場合は2以上からです -TP_LOCALLAB_NOISECHRODETAIL;色度の詳細復元 -TP_LOCALLAB_NOISECHROFINE;低い番手の色度(ウェーブレット) +TP_LOCALLAB_NOISECHRODETAIL;詳細復元(色) +TP_LOCALLAB_NOISECHROFINE;低い番手の色ノイズ(ウェーブレット) TP_LOCALLAB_NOISEGAM;ガンマ TP_LOCALLAB_NOISEGAM_TOOLTIP;ガンマが1の時は、"Lab"の輝度が使われます。ガンマが3.0の時は"線形"の輝度が使われます\n低い値にするとディテールと質感が保たれます。高い値にするとノイズ除去が強まります。 TP_LOCALLAB_NOISELEQUAL;イコライザ 白黒 TP_LOCALLAB_NOISELUMCOARSE;高い番手の輝度(ウェーブレット) -TP_LOCALLAB_NOISELUMDETAIL;輝度の詳細復元 +TP_LOCALLAB_NOISELUMDETAIL;詳細復元(輝度) TP_LOCALLAB_NOISELUMFINE;輝度 詳細レベル2(ウェーブレット) TP_LOCALLAB_NOISELUMFINETWO;輝度 詳細レベル3(ウェーブレット) TP_LOCALLAB_NOISELUMFINEZERO;輝度 詳細レベル1(ウェーブレット) @@ -3171,23 +3408,28 @@ TP_LOCALLAB_ORIGLC;元画像だけと融合 TP_LOCALLAB_ORRETILAP_TOOLTIP;'スコープ'による変更の前に、ΔEを変更します。これにより画像の異なる部分(例えば背景)に対する作用に差を付けることが出来ます。 TP_LOCALLAB_ORRETISTREN_TOOLTIP;1次ラプラシアンのしきい値に作用します。設定値を高くするほど、コントラストの違いが減少します TP_LOCALLAB_PASTELS2;自然な彩度 -TP_LOCALLAB_PDE;PDE IPOL - ダイナミックレンジ圧縮 +TP_LOCALLAB_PDE;コントラストの減衰 - ダイナミックレンジ圧縮 TP_LOCALLAB_PDEFRA;コントラストの減衰 ƒ TP_LOCALLAB_PDEFRAME_TOOLTIP;RawtherapeeはPDE IPOLのアルゴリズムを採用しています : 異なる効果が期待できますが、メインの露光補正機能とは異なる設定が必要です。\n露出不足やハイダイナミックレンジの画像の補正に便利でしょう +TP_LOCALLAB_PRECAMGAMUT_TOOLTIP;このオプションを有効した場合は、XYZマトリクスへの一次変換直後に色域が抑制されます。 +TP_LOCALLAB_PRECAMREFIMAIN_TOOLTIP;ホワイトポイントを主体色に近づけることが出来ます。彩度が変わります。“シフトx”と“シフトy”の組み合わせにより、穏やかなカラートーン調整が可能です。 +TP_LOCALLAB_PRECAMREFI_TOOLTIP;ホワイトポイントを主体色に近づけることが出来ます。彩度が変わります。 +TP_LOCALLAB_PRECAM_TOOLTIP;この‘元データの調整’機能で:a)対数符号化を使ったダイナミックレンジの圧縮、b)CIECAMの処理を行う前の画像全体のトーン、原色(単純化したアブストラクトプロファイルを使用)、及び中間トーンの調整を行うことが出来ます。各パラメータ:\nガンマは主に明るいトーンに作用し、スロープは暗いトーンに作用します。\nガンマとスロープ(両パラメータ>1)を併用することで、アルゴリズムがトーンカーブの線形部分と非線形部分の連続性を保ちます。\n\n\n変更先の原色:これを使うと画像の色(彩度)を復元或いは変更するための変更先の原色を変えることが出来ます。‘作業プロファイル’と‘変更先の原色’の違いが極端に大きくなければ、カラーバランスは十分に保たれます。作業プロファイルは変更されません。\n原色と光源(ホワイトポイント)をかなり正確に順応させることが可能です。\nホワイトポイントから原色を離すほど画像の彩度が下がります。その逆も然りですが色域には注意を必要とします。 TP_LOCALLAB_PREVHIDE;基本的な設定項目だけを表示 -TP_LOCALLAB_PREVIEW;ΔEのプレビュー +TP_LOCALLAB_PREVIEW;プレビューΔE TP_LOCALLAB_PREVSHOW;全ての設定項目を表示 +TP_LOCALLAB_PRIMILLFRAME;原色 & 光源 TP_LOCALLAB_PROXI;ΔEの減衰 TP_LOCALLAB_QUAAGRES;積極的 TP_LOCALLAB_QUACONSER;控え目 TP_LOCALLAB_QUALCURV_METHOD;カーブのタイプ TP_LOCALLAB_QUAL_METHOD;全体の質 TP_LOCALLAB_QUANONEALL;なし -TP_LOCALLAB_QUANONEWAV;ノンローカルミーンだけ +TP_LOCALLAB_QUANONEWAV;非局所平均フィルタだけ TP_LOCALLAB_RADIUS;半径 TP_LOCALLAB_RADIUS_TOOLTIP;半径が30より大きい場合は、高速フーリエ変換を使います TP_LOCALLAB_RADMASKCOL;スムーズな半径 -TP_LOCALLAB_RECOTHRES02_TOOLTIP;“回復のしきい値”が1より大きい場合は、“マスクと修正領域”に付属するマスクは、その前に画像に対して行われた全ての調整を考慮しますが、現在のツールで行われた調整(例、色と明るさや、ウェーブレット、CAM16、など)は考慮しません。\n“回復のしきい値”が1より小さい場合は、“マスクと修正領域”に付属するマスクは、その前に画像に対して行われた全ての調整を考慮しません。\n\nどちらの場合も、“回復のしきい値”は現在のツール(例、色と明るさや、ウェーブレット、CAM16、など)で調整されたマスクされた画像に作用します。 +TP_LOCALLAB_RECOTHRES02_TOOLTIP;“回復のしきい値”が1より大きい場合は、“マスクと修正”に付属するマスクは、その前に画像に対して行われた全ての調整を考慮しますが、現在のツールで行われた調整(例、色と明るさや、ウェーブレット、CAM16、など)は考慮しません。\n“回復のしきい値”が1より小さい場合は、“マスクと修正”に付属するマスクは、その前に画像に対して行われた全ての調整を考慮しません。\n\nどちらの場合も、“回復のしきい値”は現在のツール(例、色と明るさや、ウェーブレット、CAM16、など)で調整されたマスクされた画像に作用します。 TP_LOCALLAB_RECT;長方形 TP_LOCALLAB_RECURS;基準値を繰り返し更新 TP_LOCALLAB_RECURS_TOOLTIP;各機能の適用後に基準値を強制的に再計算させる機能です\nマスクを使った作業にも便利です @@ -3200,7 +3442,7 @@ TP_LOCALLAB_REPARSH_TOOLTIP;元画像に関するシャドウ/ハイライトと TP_LOCALLAB_REPARTM_TOOLTIP;元画像に関するトーンマッピングの構成の相対的強さを調整出来るようにします。 TP_LOCALLAB_REPARW_TOOLTIP;元画像に関するローカルコントラストとウェーブレットの構成の相対的強さを調整出来るようにします。 TP_LOCALLAB_RESID;残差画像 -TP_LOCALLAB_RESIDBLUR;残差画像をぼかす +TP_LOCALLAB_RESIDBLUR;残差画像のぼかし TP_LOCALLAB_RESIDCHRO;残差画像の色度 TP_LOCALLAB_RESIDCOMP;残差画像の圧縮 TP_LOCALLAB_RESIDCONT;残差画像のコントラスト @@ -3217,7 +3459,7 @@ TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;'明度=1'或いは'暗さ=2'の場合は効 TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;効果の最適化を図るため内部の変数を変えます\n'修復されたデータ'は最低値が0、最大値が32768(対数モード)に近いことが望ましいのですが、必ずしも一致させる必要はありません。 TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;対数モードを使うとコントラストが増えますが、ハロが発生することもあります TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;半径と分散(バリアンス)のスライダーは霞を調整します。前景或いは背景を目標にします -TP_LOCALLAB_RETI_SCALE_TOOLTIP;スケールが1の時は、レティネックスはローカルコントラストを調整した様な効果になります\nスケールの値を増やすと回帰作用が強化されますが、その分処理時間も増加します +TP_LOCALLAB_RETI_SCALE_TOOLTIP;スケールが1の時は、レティネックスはローカルコントラストを調整した様な効果になります\nスケールの値を増やすと回帰作用が強化されますが、その分処理時間も増加します TP_LOCALLAB_RET_TOOLNAME;霞除去 & レティネックス TP_LOCALLAB_REWEI;再加重平均の繰り返し TP_LOCALLAB_RGB;RGB トーンカーブ @@ -3225,6 +3467,7 @@ TP_LOCALLAB_RGBCURVE_TOOLTIP;RGBモードには4つの選択肢があります TP_LOCALLAB_ROW_NVIS;非表示 TP_LOCALLAB_ROW_VIS;表示 TP_LOCALLAB_RSTPROTECT_TOOLTIP;レッドと肌色の保護は、彩度や色度、鮮やかさのスライダー調整に影響します。 +TP_LOCALLAB_SATCIE;彩度の制御 TP_LOCALLAB_SATUR;彩度 TP_LOCALLAB_SATURV;彩度S TP_LOCALLAB_SCALEGR;スケール @@ -3259,49 +3502,73 @@ TP_LOCALLAB_SHARP_TOOLNAME;シャープニング TP_LOCALLAB_SHARRADIUS;半径 TP_LOCALLAB_SHORTC;ショートカーブ'L'マスク TP_LOCALLAB_SHORTCMASK_TOOLTIP;L(L)とL(H)2つのカーブをスキップします。\nマスクの作用によって調整された現在のイメージと元イメージを融合します\n但し、これが使えるのは2, 3, 4, 6, 7のマスクです -TP_LOCALLAB_SHOWC;マスクと修正領域 +TP_LOCALLAB_SHOWC;マスクと修正 TP_LOCALLAB_SHOWC1;ファイルの融合 -TP_LOCALLAB_SHOWCB;マスクと修正領域 +TP_LOCALLAB_SHOWCB;マスクと修正 TP_LOCALLAB_SHOWDCT;フーリエの処理を表示 -TP_LOCALLAB_SHOWE;マスクと修正領域 +TP_LOCALLAB_SHOWE;マスクと修正 TP_LOCALLAB_SHOWFOURIER;フーリエ (DCT) TP_LOCALLAB_SHOWLAPLACE;Δ ラプラシアン (一次) -TP_LOCALLAB_SHOWLC;マスクと修正領域 +TP_LOCALLAB_SHOWLC;マスクと修正 TP_LOCALLAB_SHOWMASK;マスクの表示 -TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;マスクと修正箇所の表示:\n注意:一度に一つの機能のマスクしか見ることが出来きません\n調整及び修正した画像:機能による調整とマスクによる修正の両方を含む画像を表示\n修正領域をマスクなしで表示:マスクを適用する前の修正領域を表示\n修正領域をマスクと共に表示:マスクを適用した修正領域を表示\nマスクの表示:カーブやフィルタの効果を含めたマスクの様子を表示します\nスポットの構造を表示:'スポットの構造'スライダー(機能水準が高度の場合)が有効になった時に、構造検出マスクを見ることが出来ます\n注意:形状検出のアルゴリズムが作用する前にマスクが適用されます +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;マスクと修正箇所の表示:\n注意:一度に一つの機能のマスクしか見ることが出来きません\n修正された画像:機能による調整とマスクによる修正の両方を含む画像を表示\n修正領域をマスクなしで表示:マスクを適用する前の修正領域を表示\n修正領域をマスクと共に表示:マスクを適用した修正領域を表示\nマスクの表示:カーブやフィルタの効果を含めたマスクの様子を表示します\nスポットの構造を表示:'スポットの構造'スライダー(機能水準が高度の場合)が有効になった時に、構造検出マスクを見ることが出来ます\n注意:形状検出のアルゴリズムが作用する前にマスクが適用されます TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;フーリエ変換による処理を段階的に見ることが出来ます\nラプラス - しきい値の関数としてラプラス変換の2次微分を計算仕します\nフーリエ - 離散コサイン変換(DCT)でラプラス変換を表示します\nポアソン - ポアソン方程式の解を表示します\n輝度の標準化なし - 輝度の標準化なしで結果を表示します -TP_LOCALLAB_SHOWMASKTYP1;ぼかし&ノイズ除去 +TP_LOCALLAB_SHOWMASKTYP1;ぼかし&ノイズ TP_LOCALLAB_SHOWMASKTYP2;ノイズ除去 -TP_LOCALLAB_SHOWMASKTYP3;ぼかし&ノイズ除去 + ノイズ除去 -TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;‘マスクと修正領域’と併せて使うことが出来ます。\n‘ぼかしとノイズ’を選択した場合、マスクはノイズ除去には使えません。\n‘ノイズ除去を選択した場合、マスクは’ぼかしとノイズ‘には使えません。\n’ぼかしとノイズ + ノイズ除去‘を選択した場合は、マスクを共有することが出来ます。但し、この場合、’ぼかしとノイズ‘とノイズ除去のスコープスライダーが有効となるので、修正を行う際には’マスクと共に修正領域を表示‘のオプションを使うことを奨めます。 -TP_LOCALLAB_SHOWMNONE;調整及び修正した画像 +TP_LOCALLAB_SHOWMASKTYP3;ぼかし&ノイズ + ノイズ除去 +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;‘マスクと修正’と併せて使うことが出来ます。\n‘ぼかしとノイズ’を選択した場合、マスクはノイズ除去には使えません。\n‘ノイズ除去を選択した場合、マスクは’ぼかしとノイズ‘には使えません。\n’ぼかしとノイズ + ノイズ除去‘を選択した場合は、マスクを共有することが出来ます。但し、この場合、’ぼかしとノイズ‘とノイズ除去のスコープスライダーが有効となるので、修正を行う際には’マスクと共に修正領域を表示‘のオプションを使うことを奨めます。 +TP_LOCALLAB_SHOWMNONE;修正された画像を表示 TP_LOCALLAB_SHOWMODIF;修正領域をマスクなしで表示 TP_LOCALLAB_SHOWMODIF2;マスクの表示 TP_LOCALLAB_SHOWMODIFMASK;修正領域をマスクと共に表示 TP_LOCALLAB_SHOWNORMAL;輝度の標準化をしない -TP_LOCALLAB_SHOWPLUS;マスクと修正領域(ぼかし&ノイズ除去) +TP_LOCALLAB_SHOWPLUS;マスクと修正(ぼかし&ノイズ) TP_LOCALLAB_SHOWPOISSON;ポアソン (pde f) -TP_LOCALLAB_SHOWR;マスクと修正領域 -TP_LOCALLAB_SHOWREF;ΔEのプレビュー -TP_LOCALLAB_SHOWS;マスクと修正領域 +TP_LOCALLAB_SHOWR;マスクと修正 +TP_LOCALLAB_SHOWREF;プレビューΔE +TP_LOCALLAB_SHOWS;マスクと修正 TP_LOCALLAB_SHOWSTRUC;スポットの構造を表示 TP_LOCALLAB_SHOWSTRUCEX;スポットの構造を表示 -TP_LOCALLAB_SHOWT;マスクと修正領域 -TP_LOCALLAB_SHOWVI;マスクと修正領域 +TP_LOCALLAB_SHOWT;マスクと修正 +TP_LOCALLAB_SHOWVI;マスクと修正 TP_LOCALLAB_SHRESFRA;シャドウ/ハイライト&TRC TP_LOCALLAB_SHTRC_TOOLTIP;'作業プロファイル'をベースに(但し、それが提供されている場合のみ)、TRC(トーンレスポンスカーブ)を使って画像のトーンを調節します。\nガンマは主に明るいトーンに作用します\n勾配は主に暗いトーンに作用します TP_LOCALLAB_SH_TOOLNAME;シャドウ/ハイライト & トーンイコライザ -TP_LOCALLAB_SIGFRA;シグモイドQと対数符号化Q -TP_LOCALLAB_SIGJZFRA;Jz シグモイド +TP_LOCALLAB_SIGBLACKSSCIE;ブラックの分布 +TP_LOCALLAB_SIGCIE;シグモイド +TP_LOCALLAB_SIGFRA;シグモイドQ +TP_LOCALLAB_SIGGAMJCIE;ガンマ +TP_LOCALLAB_SIGJZFRA;シグモイド Jz TP_LOCALLAB_SIGMAWAV;減衰応答 +TP_LOCALLAB_SIGMOID16_TOOLTIP;‘CIECAM’と‘シグモイドQ’を併用することで、トーンマッピングに似た効果を出せます。\nシグモイドQの3つのスライダー:a)コントラストはシグモイドのカーブ形状に作用し強さを調整します、b)しきい値(グレーポイント)は輝度に応じた作用の配分を調整します、c)順応性は内部の指数関数に作用することでシグモイドの作用に重みをかけます。 TP_LOCALLAB_SIGMOIDBL;ブレンド TP_LOCALLAB_SIGMOIDLAMBDA;コントラスト -TP_LOCALLAB_SIGMOIDQJ;ブラックEvとホワイトEvを使う +TP_LOCALLAB_SIGMOIDLOGAUTO;自動のしきい値 +TP_LOCALLAB_SIGMOIDLOGEV_TOOLTIP;コンボボックスによる選択で、‘ブラックEvとホワイトEv’が‘シグモイドのみ’ではなく、‘シグモイドと対数符号化’の場合は、2つのアルゴリズム、‘対数符号化’と‘シグモイド’の双方が併用して使われます。 +TP_LOCALLAB_SIGMOIDNORMCIE;輝度の標準化 +TP_LOCALLAB_SIGMOIDNORMCIEBLEND_TOOLTIP;ブレンドで画像の最終面、コントラスト及び輝度に作用する元画像と出力画像の比率を決めます。 +TP_LOCALLAB_SIGMOIDNORMCIE_TOOLTIP;元画像の輝度の平均と分散を考慮することで輝度の復元を行います。\nシグモイドQに関連がない調整も含め、J或いはQに作用する全ての調整が考慮されます。 +TP_LOCALLAB_SIGMOIDQJ;ブラックEvとホワイトEv +TP_LOCALLAB_SIGMOIDQJCOMPRCIE_TOOLTIP;コンボボックスからの選択で、‘ブラックEvとホワイトEvを使う’が、‘シグモイドと対数符号化Q’、或いは‘シグモイドの代わりに対数符号化’にチェックが入っている場合は、このアルゴリズムはしきい値の設定値以上のデータを圧縮します。この最後の値は明るさQを表していて、考えられる‘圧縮のしきい値’ (‘自動のしきい値にチェックが入っている場合に算出され、多くの場合1より大きい)に近くなるべきです。 +TP_LOCALLAB_SIGMOIDSENSI;順応性 TP_LOCALLAB_SIGMOIDTH;しきい値(グレーポイント) -TP_LOCALLAB_SIGMOID_TOOLTIP;'CIECAM'(或いは’Jz)と'シグモイド'関数を使って、トーンマッピングの様な効果を作ることが出来ます。\n3つのスライダーを使います: a) コントラストのスライダーはシグモイドの形状を変えることで強さを変えます。 b) しきい値(グレーポイント)のスライダーは、輝度に応じて作用を変えます。 c)ブレンドは画像の最終的なコントラストや輝度を変えます。 +TP_LOCALLAB_SIGMOIDWHITESCIE_TOOLTIP;画像のダイナミックレンジが高い場合、非常に明るい部分の分布と非常に暗い部分の分布を自動で調整することが出来ます。\n対数符号化、或いはブラックEvとホワイトEvを有効にしたシグモイドで使うことが出来ます。\n\nアルゴリズムが元のデータを変えることはありませんが、ダイナミックレンジ、ブラックEv、ホワイトEv、及びグレーポイントを計算する際に必要な構成要素に作用します。 +TP_LOCALLAB_SIGMOID_TOOLTIP;'Jz’と'シグモイド'関数を使って、トーンマッピングに似た効果を出せます。\n3つのスライダーを使います: a) コントラストのスライダーはシグモイドの形状を変えることで強さを変えます。 b) しきい値(グレーポイント)のスライダーは、輝度に応じて作用を変えます。 c)ブレンドは画像の最終的なコントラストや輝度を変えます。 +TP_LOCALLAB_SIGSLOPJCIE;スロープ +TP_LOCALLAB_SIGTRCCIE;元データの調整 +TP_LOCALLAB_SIGWHITESCIE;ホワイトの分布 TP_LOCALLAB_SLOMASKCOL;スロープ TP_LOCALLAB_SLOMASK_TOOLTIP;ガンマとスロープを調整することで、不連続を避けるための“L”の漸進的修正により、アーティファクトの無いマスクの修正が出来ます +TP_LOCALLAB_SLOPESMOOTH;グレーバランス(スロープ) +TP_LOCALLAB_SLOPESMOOTHB;ブルーのバランス(スロープ) +TP_LOCALLAB_SLOPESMOOTHG;グリーンのバランス(スロープ) +TP_LOCALLAB_SLOPESMOOTHR;レッドのバランス(スロープ) TP_LOCALLAB_SLOSH;スロープ +TP_LOCALLAB_SMOOTHCIE;ハイライトの減衰 +TP_LOCALLAB_SMOOTHCIE_LUM;明るさのモード +TP_LOCALLAB_SMOOTHCIE_SCA;場面のYbの尺度 +TP_LOCALLAB_SMOOTHCIE_TOOLTIP;ガンマ、スロープ及び中間トーンにより実行された処理の効果を滑らかにするもので、明るさが若干下がります。但し、これはハイライトの復元機能の代わりにはなりません。\n\nガンマとスロープの調整は以下に示す調整と合わせればトーンマッピングに似た効果をもたらします。a)場面条件のブラックEvとホワイトEv、平均輝度(Yb%)、b)観視条件の平均輝度(Yb%)。\n場面のYbの尺度はホワイトEvに応じて決まります。 +TP_LOCALLAB_SMOOTHCIE_YB;観視条件のYbの尺度 TP_LOCALLAB_SOFT;ソフトライト & 独自のレティネックス TP_LOCALLAB_SOFTM;ソフトライト TP_LOCALLAB_SOFTMETHOD_TOOLTIP;独自のレティネックスは他のレティネックス方式とは大きく異なります\nグレーと輝度のバランスに作用します @@ -3313,7 +3580,7 @@ TP_LOCALLAB_SOURCE_ABS;絶対輝度 TP_LOCALLAB_SOURCE_GRAY;平均輝度(Y%) TP_LOCALLAB_SPECCASE;特有の設定 TP_LOCALLAB_SPECIAL;RGBカーブの特殊な利用 -TP_LOCALLAB_SPECIAL_TOOLTIP;チェックボックスに✔を入れると、他の全ての作用が取り除かれます。例えば、“スコープ”, マスク, スライダーなどの作用(境界を除きます) が除かれRGBトーンカーブの効果だけが使われます +TP_LOCALLAB_SPECIAL_TOOLTIP;チェックボックスに✔を入れると、他の全ての作用が取り除かれます。例えば、“スコープ”, マスク, スライダーなどの作用(境界を除きます) が除かれRGBトーンカーブの効果だけが使われます TP_LOCALLAB_SPOTNAME;新しいスポット TP_LOCALLAB_STD;標準 TP_LOCALLAB_STR;強さ @@ -3323,19 +3590,21 @@ TP_LOCALLAB_STRENG;強さ TP_LOCALLAB_STRENGR;強さ TP_LOCALLAB_STRENGRID_TOOLTIP;望む効果は'強さ'で調整出来ますが、作用の範囲を制限する'スコープ'を使うことも出来ます。 TP_LOCALLAB_STRENGTH;ノイズ +TP_LOCALLAB_STRENGTHCIELOG;強さ TP_LOCALLAB_STRGRID;強さ TP_LOCALLAB_STRUC;構造 TP_LOCALLAB_STRUCCOL;スポットの構造 TP_LOCALLAB_STRUCCOL1;スポットの構造 -TP_LOCALLAB_STRUCT_TOOLTIP;形状検出に関する構造を考慮するSobelアルゴリズムを使います.\n'マスクと修正領域'を有効にして、マスクのプレビュー(変更なし)を見るために'スポットの構造を表示'を有効にします\n\nエッジ検出の精度を上げるため、構造マスク、ぼかしマスク、ローカルコントラスト(ウェーブレットのレベル)と共に使うことが出来ます\n\n明るさ、コントラスト、色度、露光補正、或いはマスクに関係しない機能を使った調整効果は、'調整及び修正した画像'、或いは'修正された領域をマスクと共に表示'で、見ることが出来ます +TP_LOCALLAB_STRUCT_TOOLTIP;形状検出に関する構造を考慮するSobelアルゴリズムを使います.\n'マスクと修正'を有効にして、マスクのプレビュー(変更なし)を見るために'スポットの構造を表示'を有効にします\n\nエッジ検出の精度を上げるため、構造マスク、ぼかしマスク、ローカルコントラスト(ウェーブレットのレベル)と共に使うことが出来ます\n\n明るさ、コントラスト、色度、露光補正、或いはマスクに関係しない機能を使った調整効果は、'修正された画像を表示'、或いは'修正された領域をマスクと共に表示'で、見ることが出来ます TP_LOCALLAB_STRUMASKCOL;構造マスクの強さ -TP_LOCALLAB_STRUMASK_TOOLTIP;“機能としての構造のマスク”オプションを無効のままで構造のマスク(スライダー)を使う:この場合、3つのカーブが活用されていなくても、構造を表示するマスクが生成されます。構造のマスクはマスク1(ぼかしとノイズ除去)とマスク7(色と明るさ)で使えます +TP_LOCALLAB_STRUMASK_TOOLTIP;“機能としての構造のマスク”オプションを無効のままで構造のマスク(スライダー)を使う:この場合、3つのカーブが活用されていなくても、構造を表示するマスクが生成されます。構造のマスクはマスク1(ぼかし&ノイズ)とマスク7(色と明るさ)で使えます TP_LOCALLAB_STRUSTRMASK_TOOLTIP;このスライダーの調整は控えめに行うことを奨めます TP_LOCALLAB_STYPE;スポットの変形方法 TP_LOCALLAB_STYPE_TOOLTIP;2つのタイプから選びます:\nシンメトリックは左と右の境界線、上部と底部の境界線がリンクしています\n独立は全ての境界線を独立で動かすことが出来ます TP_LOCALLAB_SYM;シンメトリック(マウス) TP_LOCALLAB_SYMSL;シンメトリック(マウス + スライダー) TP_LOCALLAB_TARGET_GRAY;平均輝度(Yb%) +TP_LOCALLAB_TE_PIVOT;ピボット(Ev) TP_LOCALLAB_THRES;しきい値の構造 TP_LOCALLAB_THRESDELTAE;ΔE-スコープのしきい値 TP_LOCALLAB_THRESRETI;しきい値 @@ -3355,17 +3624,18 @@ TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;マスクがあれば、それを修正する TP_LOCALLAB_TOOLMASK;マスクツール TP_LOCALLAB_TOOLMASK_2;ウェーブレット TP_LOCALLAB_TOOLMASK_TOOLTIP;'機能としての構造のマスク'のオプションを有効にして、構造マスク(スライダー)を使う:この場合、構造を表示するマスクは、1回以上2つのカーブ、L(L)或いはLC(H)が変更された後に生成されます\nここで、'構造マスク'は他のマスクの様な機能を果たします:ガンマ、スロープなど\n画像の構造に応じてマスクの作用を変えられます。このオプションは'ΔE画像のマスク'と付随する'スコープ(Δ”画像のマスク)'に敏感に作用します -TP_LOCALLAB_TRANSIT;境界の階調調整 -TP_LOCALLAB_TRANSITGRAD;XY軸方向の境界の差別 -TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Y軸方向の作用の領域を変えることが出来ます -TP_LOCALLAB_TRANSITVALUE;境界値 -TP_LOCALLAB_TRANSITWEAK;境界値の減衰(線形~Log) -TP_LOCALLAB_TRANSITWEAK_TOOLTIP;境界値の減衰を調節 : 処理の滑らかさを変える - 1 線形 - 2 パラボリック - 3~25乗\n非常に低い境界値と併せれば、CBDL、ウェーブレット、色と明るさを使った不良部分の補正に使うことが出来ます。 -TP_LOCALLAB_TRANSIT_TOOLTIP;RT-スポットの中心円からフレームの間で作用が働く領域と作用が減衰する領域の境界を、中心円からフレームまでの%で調整します +TP_LOCALLAB_TRANSIT;変移の階調 +TP_LOCALLAB_TRANSITGRAD;XY軸方向による変移の差別化 +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Y軸方向の作用の範囲を変えることが出来ます +TP_LOCALLAB_TRANSITVALUE;変移の位置 +TP_LOCALLAB_TRANSITWEAK;変移の減衰(線形~Log) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;変移の減衰を調節 : 処理の滑らかさを変える - 1 線形 - 2 パラボリック - 3~25乗\n非常に低い変移の位置と併せれば、CBDL、ウェーブレット、色と明るさを使った不良部分の補正に使うことが出来ます。 +TP_LOCALLAB_TRANSIT_TOOLTIP;RT-スポットの中心円からフレームの間で作用が働く領域と作用が減衰する領域の変移の位置を、中心円からフレームまでの%で調整します TP_LOCALLAB_TRANSMISSIONGAIN;透過のゲイン TP_LOCALLAB_TRANSMISSIONMAP;透過マップ TP_LOCALLAB_TRANSMISSION_TOOLTIP;透過に応じて透過を決めるカーブです\n横軸はマイナス値(最小)から平均値、プラス値(最大)まであります\n\nこのカーブを使って透過を変え、アーティファクトを軽減できます -TP_LOCALLAB_USEMASK;ラプラス変換 +TP_LOCALLAB_TRCFRAME;トーンリプロダクションカーブ & 中間トーン +TP_LOCALLAB_USEMASK;ラプラス作用素 TP_LOCALLAB_VART;分散(コントラスト) TP_LOCALLAB_VIBRANCE;自然な彩度 & ウォーム/クール TP_LOCALLAB_VIBRA_TOOLTIP;自然な彩度を調整する機能です(基本的にはメインの自然な彩度と同じです)\nCIECAMのアルゴリズムを使ったホワイトバランス調整と同等の作用をします @@ -3401,11 +3671,11 @@ TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;X軸は右側ほどローカルコントラス TP_LOCALLAB_WAT_WAVTM_TOOLTIP;各レベルの圧縮カーブを中央より下げる(マイナス)とトーンマッピングのような効果になります。\n中央より上では(プラス)、レベルのコントラストが減衰します。\nX軸は左から右に向って、大きなディテールのレベルを表しています。 TP_LOCALLAB_WAV;ローカルコントラスト TP_LOCALLAB_WAVBLUR_TOOLTIP;分解された各レベル、及び残差画像にぼかしをかけます -TP_LOCALLAB_WAVCOMP;ウェーブレットのレベルによる圧縮 -TP_LOCALLAB_WAVCOMPRE;ウェーブレットのレベルによる圧縮 +TP_LOCALLAB_WAVCOMP;ウェーブレットのレベルの圧縮 +TP_LOCALLAB_WAVCOMPRE;ウェーブレットのレベルの圧縮 TP_LOCALLAB_WAVCOMPRE_TOOLTIP;トーンマッピングを適用する、或いは各レベルのローカルコントラストを減らすことが出来ます。\nX軸は左から右に向って、大きなディテールのレベルを表しています。 TP_LOCALLAB_WAVCOMP_TOOLTIP;ウェーブレット分解の方向(水平、垂直、斜め)をベースにローカルコントラストを適用します。 -TP_LOCALLAB_WAVCON;ウェーブレットのレベルによるコントラスト調整 +TP_LOCALLAB_WAVCON;レベルによるコントラスト調整 TP_LOCALLAB_WAVCONTF_TOOLTIP;”詳細レベルによるコントラスト調整”に似ています。X軸の右側ほど大きいディテールのレベルを意味します。 TP_LOCALLAB_WAVDEN;輝度ノイズ除去 TP_LOCALLAB_WAVE;ウェーブレット @@ -3414,7 +3684,7 @@ TP_LOCALLAB_WAVEEDG_TOOLTIP;エッジに対するローカルコントラスト TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;’ローカルコントラスト’で使うウェーブレットのレベルの範囲 TP_LOCALLAB_WAVGRAD_TOOLTIP;設定した階調と角度に応じて、ローカルコントラストが変わるようにします。輝度値ではなく、輝度値の差を考慮しています。 TP_LOCALLAB_WAVHUE_TOOLTIP;色相に基づいてノイズ除去の強弱を加減できます。 -TP_LOCALLAB_WAVLEV;ウェーブレットのレベルによるぼかし +TP_LOCALLAB_WAVLEV;ウェーブレットのレベルのぼかし TP_LOCALLAB_WAVMASK;ローカルコントラスト TP_LOCALLAB_WAVMASK_TOOLTIP;マスクのローカルコントラストを変えるためにウェーブレットを使い、構造(肌、建物など)を強化したり弱めたりします TP_LOCALLAB_WEDIANHI;メディアン 高 @@ -3732,6 +4002,16 @@ TP_TM_FATTAL_AMOUNT;量 TP_TM_FATTAL_ANCHOR;アンカー TP_TM_FATTAL_LABEL;ダイナミックレンジ圧縮 TP_TM_FATTAL_THRESHOLD;ディテール +TP_TONE_EQUALIZER_BANDS;バンド +TP_TONE_EQUALIZER_BAND_0;ブラック +TP_TONE_EQUALIZER_BAND_1;シャドウ +TP_TONE_EQUALIZER_BAND_2;中間トーン +TP_TONE_EQUALIZER_BAND_3;ハイライト +TP_TONE_EQUALIZER_BAND_4;ホワイト +TP_TONE_EQUALIZER_DETAIL;円滑化 +TP_TONE_EQUALIZER_LABEL;トーンイコライザ +TP_TONE_EQUALIZER_PIVOT;ピボット(Ev) +TP_TONE_EQUALIZER_SHOW_COLOR_MAP;トーンの配分を表示 TP_VIBRANCE_AVOIDCOLORSHIFT;色ずれを回避 TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;肌色トーン @@ -3983,7 +4263,7 @@ TP_WAVELET_STRENGTH;強さ TP_WAVELET_SUPE;エキストラ TP_WAVELET_THR;シャドウのしきい値 TP_WAVELET_THRDEN_TOOLTIP;ローカルコントラストに応じたノイズ除去の目安に使うため、ステップカーブを作成します。ノイズ除去がコントラストの低い均一な画質部分に適用されます。詳細がある部分(コントラストが高い)は保持されます。 -TP_WAVELET_THREND;ローカルコントラストのしきい値 +TP_WAVELET_THREND;ローカルコントラストのしきい値 TP_WAVELET_THRESHOLD;調整レベル(小さいディテール) TP_WAVELET_THRESHOLD2;調整レベル(大きいディテール) TP_WAVELET_THRESHOLD2_TOOLTIP;設定値より上のレベルだけが、大きなディテールのレベルの輝度範囲で設定された条件で調整されます。 @@ -4035,6 +4315,45 @@ TP_WBALANCE_FLUO_HEADER;蛍光灯 TP_WBALANCE_GREEN;色偏差 TP_WBALANCE_GTI;GTI TP_WBALANCE_HMI;HMI +TP_WBALANCE_ITCWALG_TOOLTIP;可能であれば、別な代替え色温度に切り替えることが出来ます。\n“単一の選択”の場合は出来ません。 +TP_WBALANCE_ITCWBDELTA_TOOLTIP;“色偏差”の繰り返し計算の際に固定されます。色温度の違いは考慮されます。 +TP_WBALANCE_ITCWBFGREEN_TOOLTIP;スチューデントの検定結果と色編間の最良の妥協点を探ります。 +TP_WBALANCE_ITCWBMINSIZEPATCH_TOOLTIP;最小パッチの値の設定が可能です。設定値が小さ過ぎると相関関係の欠如につながることがあります。 +TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;マゼンタ/パープルの色データを画像から取り除くことが出来ます。このオプションを有効にすると、Y値を制限するフィルタが適用されます。デフォルトではこの値が0.4に設定されています。変更は‘オプション‘ファイルの‘Itcwb Ypurple‘(最大値1)で行います。 +TP_WBALANCE_ITCWBPRECIS_TOOLTIP;値が低いほど処理に係るデータが増え処理時間が長くなりますが、元々処理時間は短いので、普通はデフォルトで設定されている低い設定値で構わないでしょう。 +TP_WBALANCE_ITCWBRGREEN_TOOLTIP;繰り返し計算における色偏差値の評価の幅です。低幅の場合は0.82から1.25、最大幅は0.4から4.0になります。 +TP_WBALANCE_ITCWBSIZEPATCH_TOOLTIP;アルゴリズムが使用するカラーデータの大きさを設定するものです。 +TP_WBALANCE_ITCWBSIZE_TOOLTIP;参考スペクトルカラーと画像の色のxyY値との間で最良の対応を探るための繰り返し計算の回数を設定します。設定値3が程好い妥協点と思われます。 +TP_WBALANCE_ITCWBTHRES_TOOLTIP;スペクトルデータと画像データの間の比較のサンプリングを制限します。 +TP_WBALANCE_ITCWB_ALG;2工程アルゴリズムを除外 +TP_WBALANCE_ITCWB_CUSTOM;独自の色温度と色偏差を使用 +TP_WBALANCE_ITCWB_DELTA;色偏差のループにおけるΔ色温度 +TP_WBALANCE_ITCWB_FGREEN;色偏差のスチューデント検定を探す +TP_WBALANCE_ITCWB_FORCED;CIEダイヤグラムと概ね同じ範囲 +TP_WBALANCE_ITCWB_FRA;自動色温度相関関係の設定 +TP_WBALANCE_ITCWB_FRA_TOOLTIP;画像(rawの形式、測色など)に応じて、これらの設定で‘色温度の相関関係‘アルゴリズムの適応を可能にします。最良の結果を得るためのパラメータ調整に特別な法則はありません。 +TP_WBALANCE_ITCWB_MINSIZEPATCH;最小のパッチサイズ +TP_WBALANCE_ITCWB_NOPURPLE;パープルのフィルタ +TP_WBALANCE_ITCWB_PRECIS;精度の高いアルゴリズム - スケールを使用 +TP_WBALANCE_ITCWB_PRIM_ACE;CIEダイヤグラム全体を使うことを強制する +TP_WBALANCE_ITCWB_PRIM_ADOB;ミディアムサンプリング +TP_WBALANCE_ITCWB_PRIM_BETA;ミディアムサンプリング - ポインターん色域に近い +TP_WBALANCE_ITCWB_PRIM_JDCMAX;完全なCIEダイヤグラムに近い +TP_WBALANCE_ITCWB_PRIM_REC;ハイサンプリング +TP_WBALANCE_ITCWB_PRIM_SRGB;ローサンプリングを使用、カメラの設定を無視する +TP_WBALANCE_ITCWB_PRIM_XYZCAM;カメラのXYZマトリクス +TP_WBALANCE_ITCWB_PRIM_XYZCAM2;カメラのXYZマトリクス後のJDCmax +TP_WBALANCE_ITCWB_RGREEN;色偏差の範囲 +TP_WBALANCE_ITCWB_SAMPLING;ローサンプリング 5.9 +TP_WBALANCE_ITCWB_SIZE;ヒストグラムと比較した参考色の大きさ +TP_WBALANCE_ITCWB_SIZEPATCH;カラーパッチの大きさ +TP_WBALANCE_ITCWB_THRES;画像に使われている色(プリセット) +TP_WBALANCE_ITCWCUSTOM_TOOLTIP;色温度と色偏差の独自設定が可能です。\n\n 利用のためのヒント:\n 1)Itcwbを選択し、‘独自の色温度と色偏差‘有効にする。\n 2)好みの色温度と色偏差を設定:自由、ピック。。。(独自)\n 3)‘色温度の相関関係‘に戻る。\n\n これを使用する場合は、2工程のアルゴリズム、自動色温度バイアス、色偏差の微調整は使えません。 +TP_WBALANCE_ITCWFORCED_TOOLTIP;デフォルトでは(ボックスにチェックが入っていない状態)、サンプリングの際にスキャンされたデータは、DCPのキャリブレーション、ICCプロファイル、カラーチェッカー24、ウェブサイトなどに幅広く使われるsRGBプロファイルに戻されます。\n 色域が非常に広い画像(花や人口色)の場合、CIExyダイヤグラム全体を使う必要があるかもしれません。その場合はプロファイルにACESP0が使われるでしょう。後者のケースでは、アルゴリズムに対し内部で使われる色の数がより重要になります。 +TP_WBALANCE_ITCWGREEN;色偏差の微調整 +TP_WBALANCE_ITCWGREEN_TOOLTIP;この機能は、アルゴリズムをスタートさせる際の参考地となる“色偏差”の変更を可能にするものです。“自動ホワイトバランスの色温度 バイアス”とほぼ同じ働きを色編に対して及ぼします。\n 変更を行うとアルゴリズムは計算を最初からやり直します。 +TP_WBALANCE_ITCWPRIM_TOOLTIP;画像サンプリングの選択が出来ます。\n ‘CIEダイヤグラムに近いサンプリング‘ これはカメラの撮像センサーが捉えたデータの殆どを対象としますが、想像上の色が含まれるかもしれません。\n ‘カメラのXYZマトリクス‘ カラーマトリクスから直接的に導いたマトリクスです。\n ミディアムサンプリング(デフォル)‐ポインターの色域に近いものです:人間の視覚に非常に近い色域です。\n 他にも‘ローサンプリング‘と‘カメラの設定を無視‘という選択肢があります。これらは画像の色度が高い部分を計算に入れない、または色偏差が0.8より大きい場合に、カメラの設定を無視しますので、結果にそれなりの影響だ出ます。\n\nこれらサンプリングはチャンネル乗数だけに影響するもので、‘作業プロファイル‘には影響せず、画像の色域を変えることもありません。 +TP_WBALANCE_ITCWSAMPLING_TOOLTIP;バージョン5.9との互換性が良い古いサンプリングアルゴリズムを使うことが出来ます。標準観測者10°のオプションは有効にしておきます(デフォルト)。 TP_WBALANCE_JUDGEIII;JudgeIII TP_WBALANCE_LABEL;ホワイトバランス TP_WBALANCE_LAMP_HEADER;ランプ @@ -4042,6 +4361,14 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;方式 +TP_WBALANCE_MULLABEL;乗数: レッド=%1 グリーン=%2 ブルー=%3 +TP_WBALANCE_MULLABEL_TOOLTIP;乗数は情報として表示されるだけで、変更は出来ません。 +TP_WBALANCE_OBSERVER10;標準観測者2°の代わりに標準観測者10°を使用 +TP_WBALANCE_OBSERVER10_TOOLTIP;RawTherapeeのカラーマネジメント(ホワイトバランス、チャンネル乗数、ハイライト復元。。。)では、光源や色のスペクトルデータを使っています。目の知覚角度を考慮する標準観測者は、カラーマネジメントの重要な変数の一つです。1931年、その角度は2°に固定されましたが(目の錐体を優先)、1964年になると10°(錐体が優先されるが、桿体も部分的に考慮する)が使われるようになりました。\n稀に”標準観測者2°で色ずれが生じた時は(恐らく変換マトリクスに起因する)、”標準観測者10°”に切り替えて下さい。 +TP_WBALANCE_PATCHLABEL;色の読み込み=%1 色のパッチ=%2 サイズ=%3 +TP_WBALANCE_PATCHLABEL_TOOLTIP;読み込んだ色の数を表示します(最大237個)。\n 算出されたパッチの色度を表示します。\n 自動ホワイトバランスの色温度バイアスの値を下げてみて下さい。最低値を設定するとアルゴリズムが最適になるようです。\n パッチサイズは色度の最適化につながります。 +TP_WBALANCE_PATCHLEVELLABEL;パッチ: ΔE=%1 - データ x 9 最小値=%2 最大値=%3 +TP_WBALANCE_PATCHLEVELLABEL_TOOLTIP;画像とスペクトルデータ間のΔEパッチ(十分なスペクトルデータがあるという前提で)を表示します。\n 見つけたデータを表示します。これら2つの値はそれぞれ考慮される最小値と最大値を示しています。画像の関係するピクセル数を得るために、係数x9の値は考慮されなければなりません。 TP_WBALANCE_PICKER;ピック TP_WBALANCE_SHADE;日陰 TP_WBALANCE_SIZE;サイズ: @@ -4050,8 +4377,9 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;ピペットを使ってプレビュー画像のニュートラルな部分をピックアップ -TP_WBALANCE_STUDLABEL;t検定 Itcwb: %1 -TP_WBALANCE_STUDLABEL_TOOLTIP;t検定の結果を表示\n低い値ほど相関関係が良いことになります\n値が0.002以下はエクセレント\n0.005以下は非常に良い\n0.01以下は良い\n0.05以下は十分\n0.5以上は悪い\n光源が標準的ではない場合は、t検定が良好であってもホワイトバラスが良いことにはなりません\nt検定結果が1000と表示された場合は反復解析が行われなかったことを意味します。良い結果と想定される前の計算結果が使われます +TP_WBALANCE_STUDLABEL;相関関係:%1 工程:%2 悪い入れ替え:%3 +TP_WBALANCE_STUDLABEL1;相関関係:%1 工程:%2 最適な入れ替え:%3 +TP_WBALANCE_STUDLABEL_TOOLTIP;t検定の結果を表示\n低い値ほど相関関係が良いことになります\n値が0.002以下はエクセレント\n0.005以下は非常に良い\n0.01以下は良い\n0.05以下は十分\n0.5以上は悪い\n光源が標準的ではない場合は、t検定が良好であってもホワイトバラスが良いことにはなりません\nt検定結果が1000と表示された場合は反復解析が行われなかったことを意味します。良い結果と想定される前の計算結果が使われます TP_WBALANCE_TEMPBIAS;自動ホワイトバランス 色温度のバイアス TP_WBALANCE_TEMPBIAS_TOOLTIP;'自動ホワイトバランスの計算に変更を加えます'\n色温度を変えることで画像の暖かみを増やしたり、冷たさを増やしたりします。\n偏向の度合いは色温度の割合で表示されます\n従って計算値は "算出した色温度 + 算出した色温度 * 偏向"で計算したものです TP_WBALANCE_TEMPERATURE;色温度 @@ -4071,177 +4399,6 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!ERROR_MSG_METADATA_VALUE;Metadata: error setting %1 to %2 -!EXIFFILTER_PATH;File path -!EXIFPANEL_ACTIVATE_ALL_HINT;Select all tags -!EXIFPANEL_ACTIVATE_NONE_HINT;Unselect all tags -!EXIFPANEL_BASIC_GROUP;Basic -!EXIFPANEL_VALUE_NOT_SHOWN;Not shown -!FILEBROWSER_POPUPSORTBY;Sort Files -!FILECHOOSER_FILTER_EXECUTABLE;Executable files -!GENERAL_OTHER;Other -!HISTORY_MSG_DIRPYRDENOISE_GAIN;NR - Compensate for lightness -!HISTORY_MSG_FF_FROMMETADATA;Flat-Field - From Metadata -!HISTORY_MSG_GAMUTMUNSEL;Gamut-Munsell -!HISTORY_MSG_HLTH;Inpaint opposed - gain threshold -!HISTORY_MSG_ICM_GAMUT;Gamut control -!HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot -!HISTORY_MSG_LOCAL_GAMUTMUNSEL;Local - SC - Avoid Color Shift -!HISTORY_MSG_LOCAL_TMO_SATUR;Local Exp Fattal Saturation -!HISTORY_MSG_TONE_EQUALIZER_BANDS;Tone equalizer - Bands -!HISTORY_MSG_TONE_EQUALIZER_ENABLED;Tone equalizer -!HISTORY_MSG_TONE_EQUALIZER_PIVOT;Tone equalizer - Pivot -!HISTORY_MSG_TONE_EQUALIZER_REGULARIZATION;Tone equalizer - Regularization -!HISTORY_MSG_TONE_EQUALIZER_SHOW_COLOR_MAP;Tone equalizer - Tonal map -!HISTORY_MSG_WBALANCE_OBSERVER10;Observer 10° -!HISTORY_MSG_WBITC_CUSTOM;Itcwb Custom -!HISTORY_MSG_WBITC_DELTA;Itcwb Delta green -!HISTORY_MSG_WBITC_FGREEN;Itcwb Green - student -!HISTORY_MSG_WBITC_FORCE;Itcwb Force -!HISTORY_MSG_WBITC_GREEN;Green refinement -!HISTORY_MSG_WBITC_MINSIZE;Patch min size -!HISTORY_MSG_WBITC_NOPURPLE;Itcwb Nopurple -!HISTORY_MSG_WBITC_OBS;Remove algo 2 passes -!HISTORY_MSG_WBITC_PONDER;Itcwb ponderated -!HISTORY_MSG_WBITC_PRECIS;Itcwb Precision -!HISTORY_MSG_WBITC_PRIM;Primaries -!HISTORY_MSG_WBITC_RGREEN;Itcwb Green range -!HISTORY_MSG_WBITC_SAMPLING;Low sampling -!HISTORY_MSG_WBITC_SIZE;Itcwb Size -!HISTORY_MSG_WBITC_SORTED;Itcwb ponderated -!HISTORY_MSG_WBITC_THRES;Itcwb Threshold -!PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata -!PARTIALPASTE_TONE_EQUALIZER;Tone equalizer -!PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory -!PREFERENCES_EXTERNALEDITOR_CHANGE;Change Application -!PREFERENCES_EXTERNALEDITOR_CHANGE_FILE;Change Executable -!PREFERENCES_EXTERNALEDITOR_COLUMN_COMMAND;Command -!PREFERENCES_EXTERNALEDITOR_COLUMN_NAME;Name -!PREFERENCES_EXTERNALEDITOR_COLUMN_NATIVE_COMMAND;Native command -!PREFERENCES_LENSFUNDBDIR;Lensfun database directory -!PREFERENCES_LENSFUNDBDIR_TOOLTIP;Directory containing the Lensfun database. Leave empty to use the default directories. -!PREFERENCES_LENSPROFILESDIR;Lens profiles directory -!PREFERENCES_LENSPROFILESDIR_TOOLTIP;Directory containing Adobe Lens Correction Profiles (LCPs) -!PREFERENCES_METADATA;Metadata -!PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars -!PREFERENCES_METADATA_SYNC_NONE;Off -!PREFERENCES_METADATA_SYNC_READ;Read only -!PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional -!PREFERENCES_TAB_FAVORITES;Favorites -!PREFERENCES_TOOLPANEL_AVAILABLETOOLS;Available Tools -!PREFERENCES_TOOLPANEL_CLONE_FAVORITES;Keep favorite tools in original locations -!PREFERENCES_TOOLPANEL_CLONE_FAVORITES_TOOLTIP;If set, favorite tools will appear in both the favorites tab and their original tabs.\n\nNote: Enabling this option may result in a slight delay when switching tabs. -!PREFERENCES_TOOLPANEL_FAVORITE;Favorite -!PREFERENCES_TOOLPANEL_FAVORITESPANEL;Favorites Panel -!PREFERENCES_TOOLPANEL_TOOL;Tool -!PREFERENCES_WBA;White Balance -!PREFERENCES_WBACORR;White Balance - Automatic temperature correlation -!PREFERENCES_WBACORR_TOOLTIP;These settings allow, depending on the images (type of raw file, colorimetry, etc.), an adaptation of the " Temperature correlation " algorithm in order to obtain the best overall results. There is no absolute rule, linking these parameters to the results obtained.\n\nThe settings are of 3 types: \n* those accessible to the user from the GUI.\n* those accessible only in reading from each pp3 file : Itcwb_minsize=20, Itcwb_delta=4 Itcwb_rgreen=1 Itcwb_nopurple=false (See Rawpedia)\n* those accessible to the user in 'options' (see Rawpedia)\n You can use "Awb temperature bias" and "Green refinement" to adjust the results. Each movement of these commands brings a new calculation of temperature, tint and correlation.\n\nPlease note that the 3 indicators 'Correlation factor', 'Patch chroma' and ΔE are given for information only. It is not because one of these indicators is better that the result will necessarily be better. -!PREFERENCES_WBAENA;Show White Balance Auto temperature correlation settings -!PREFERENCES_WBAENACUSTOM;Use Custom temperature & tint -!PREFERENCES_WBAFORC;Forces Extra algoritm -!PREFERENCES_WBAGREENDELTA;Delta temperature in green iterate loop (if Force Extra enabled) -!PREFERENCES_WBANOPURP;No purple color used -!PREFERENCES_WBAPATCH;Number maximum of colors used in picture -!PREFERENCES_WBAPRECIS;Precision algorithm - scale used -!PREFERENCES_WBASIZEREF;Size of reference color compare to size of histogram color -!PREFERENCES_WBASORT;Sort in chroma order instead of histogram -!PREFERENCES_XMP_SIDECAR_MODE;XMP sidecar style -!PREFERENCES_XMP_SIDECAR_MODE_EXT;darktable-like (FILENAME.ext.xmp for FILENAME.ext) -!PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext) -!SAVEDLG_BIGTIFF;BigTIFF (no metadata support) -!SORT_ASCENDING;Ascending -!SORT_BY_DATE;By Date -!SORT_BY_EXIF;By EXIF -!SORT_BY_LABEL;By Color Label -!SORT_BY_NAME;By Name -!SORT_BY_RANK;By Rank -!SORT_DESCENDING;Descending -!TP_COLORAPP_CIECAT_DEGREEOUT;Chromatic Adaptation Viewing -!TP_COLORAPP_TEMPOUT_TOOLTIP;Temperature and Tint.\nDepending on the choices made previously, the selected temperature is:\nWhite balance\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504\nFree. -!TP_DIRPYRDENOISE_MAIN_AUTO_GAIN;Compensate for lightness -!TP_DIRPYRDENOISE_MAIN_AUTO_GAIN_TOOLTIP;Alter the noise reduction strength based on the image lightness. Strength is reduced for dark images and increased for bright images. -!TP_FILMNEGATIVE_PICK_SIZE;Size: -!TP_FILMNEGATIVE_REF_SIZE;Size: -!TP_FLATFIELD_FROMMETADATA;From Metadata -!TP_HLREC_COLOROPP;Inpaint Opposed -!TP_HLREC_HLTH;Gain threshold -!TP_ICM_GAMUT;Gamut control -!TP_ICM_WORKING_PRIM_JDCMAX;JDC Max -!TP_LOCALLAB_CHRO46LABEL;Chroma levels 456: Mean=%1 High=%2 -!TP_LOCALLAB_CHROLABEL;Chroma levels 0123: Mean=%1 High=%2 -!TP_LOCALLAB_DENOIWAVCH;Wavelets: Chrominance -!TP_LOCALLAB_DENOIWAVLUM;Wavelets: Luminance -!TP_LOCALLAB_FATSAT;Saturation control -!TP_LOCALLAB_GAMUTLABRELA;Lab -!TP_LOCALLAB_GAMUTMUNSELL;Munsell only -!TP_LOCALLAB_GAMUTNON;None -!TP_LOCALLAB_GAMUTXYZABSO;XYZ Absolute -!TP_LOCALLAB_GAMUTXYZRELA;XYZ Relative -!TP_LOCALLAB_LCLABELS;Residual noise levels -!TP_LOCALLAB_LCLABELS_TOOLTIP;Displays the mean and high-end noise values for the area shown in the Preview Panel (at 100% zoom). The noise values are grouped by wavelet levels 0,1,2,3 and 4,5,6.\nThe displayed values are indicative only and are designed to assist with denoise adjustments. They should not be interpreted as absolute noise levels.\n\n 300: Very noisy\n 100-300: Noisy\n 50-100: Moderatly noisy\n < 50: Low noise\n\nThey allow you to see:\n*The impact of Noise Reduction in the main-menu Detail tab.\n*The influence of Non-local Means, Wavelets and DCT on the luminance noise.\n*The influence of Wavelets and DCT on the chroma noise.\n*The influence of Capture Sharpening and Demosaicing. -!TP_LOCALLAB_LUM46LABEL;Luma levels 456: Mean=%1 High=%2 -!TP_LOCALLAB_LUMLABEL;Luma levels 0123: Mean=%1 High=%2 -!TP_LOCALLAB_TE_PIVOT;Pivot (Ev) !TP_NEUTRAL_TOOLTIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. -!TP_TONE_EQUALIZER_BANDS;Bands -!TP_TONE_EQUALIZER_BAND_0;Blacks -!TP_TONE_EQUALIZER_BAND_1;Shadows -!TP_TONE_EQUALIZER_BAND_2;Midtones -!TP_TONE_EQUALIZER_BAND_3;Highlights -!TP_TONE_EQUALIZER_BAND_4;Whites -!TP_TONE_EQUALIZER_DETAIL;Regularization -!TP_TONE_EQUALIZER_LABEL;Tone Equalizer -!TP_TONE_EQUALIZER_PIVOT;Pivot (Ev) -!TP_TONE_EQUALIZER_SHOW_COLOR_MAP;Show tonal map -!TP_WBALANCE_ITCWALG_TOOLTIP;Allows you to switch to the other Alternative temperature (Alt_temp), when possible.\nInactive in the "single choice" case. -!TP_WBALANCE_ITCWBDELTA_TOOLTIP;Fixed for each "green" iteration tried, the temperature difference to be taken into account. -!TP_WBALANCE_ITCWBFGREEN_TOOLTIP;Find the best compromise between Student and green. -!TP_WBALANCE_ITCWBMINSIZEPATCH_TOOLTIP;Allows you to set the minimum patch value. values that are too low can lead to a lack of correlation. -!TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;Allows you to filter magenta/purple data from the image. If the box is checked a filter limiting the value of Y is applied. By default this value is 0.4. You can change it in 'options' Itcwb_Ypurple (Maximum 1) -!TP_WBALANCE_ITCWBPRECIS_TOOLTIP;The lower the value, the more relevant the data, but increases the processing time. Since the processing time is low, this parameter should generally be able to remain at the default value -!TP_WBALANCE_ITCWBRGREEN_TOOLTIP;Sets the green value review amplitude in iterations, from low amplitude 0.82 to 1.25 to maximum amplitude 0.4 to 4. -!TP_WBALANCE_ITCWBSIZEPATCH_TOOLTIP;This setting sets the size of color datas used by algorithm. -!TP_WBALANCE_ITCWBSIZE_TOOLTIP;This setting sets the number of iterations to find the best correspondence between the reference spectral colors and those in xyY value of the image. A value of 3 seams a good compromise. -!TP_WBALANCE_ITCWBTHRES_TOOLTIP;Limits comparison sampling between spectral data and image data. -!TP_WBALANCE_ITCWB_ALG;Remove 2 pass algorithm -!TP_WBALANCE_ITCWB_CUSTOM;Use Custom temperature & tint -!TP_WBALANCE_ITCWB_DELTA;Delta temperature in green loop -!TP_WBALANCE_ITCWB_FGREEN;Find green student -!TP_WBALANCE_ITCWB_FORCED;Close to full CIE diagram -!TP_WBALANCE_ITCWB_FRA;Auto temperature correlation settings -!TP_WBALANCE_ITCWB_FRA_TOOLTIP;These settings allow, depending on the images (type of raw, colorimetry, etc.), an adaptation of the 'Temperature correlation' algorithm. There is no absolute rule linking these parameters to the results obtained. -!TP_WBALANCE_ITCWB_MINSIZEPATCH;Patch minimum size -!TP_WBALANCE_ITCWB_NOPURPLE;Filter on purple color -!TP_WBALANCE_ITCWB_PRECIS;Precision algorithm - scale used -!TP_WBALANCE_ITCWB_PRIM_ACE;Forces use of the entire CIE diagram -!TP_WBALANCE_ITCWB_PRIM_ADOB;Medium sampling -!TP_WBALANCE_ITCWB_PRIM_BETA;Medium sampling - near Pointer's gamut -!TP_WBALANCE_ITCWB_PRIM_JDCMAX;Close to full CIE diagram -!TP_WBALANCE_ITCWB_PRIM_REC;High sampling -!TP_WBALANCE_ITCWB_PRIM_SRGB;Low sampling & Ignore Camera settings -!TP_WBALANCE_ITCWB_PRIM_XYZCAM;Camera XYZ matrix -!TP_WBALANCE_ITCWB_PRIM_XYZCAM2;JDCmax after Camera XYZ matrix -!TP_WBALANCE_ITCWB_RGREEN;Green range -!TP_WBALANCE_ITCWB_SAMPLING;Low sampling 5.9 -!TP_WBALANCE_ITCWB_SIZE;Size of ref. color compare to histogram -!TP_WBALANCE_ITCWB_SIZEPATCH;Size of color patch -!TP_WBALANCE_ITCWB_THRES;Colors used in picture (preset) -!TP_WBALANCE_ITCWCUSTOM_TOOLTIP;Allows you to use Custom settings Temperature and Green (tint).\n\nUsage tips:\n1) start Itcwb , enable 'Use Custom temperature and tint'.\n2) Set 'Temperature and tint' to your liking :free, Pick,...(Custom)\n3) go back to 'Temperature correlation'.\n\nYou cannot use : 2 passes, AWB temperature bias, Green refinement. -!TP_WBALANCE_ITCWFORCED_TOOLTIP;By default (box not checked) the data scanned during sampling is brought back to the sRGB profile, which is the most widespread, both for calibrating DCP or ICC profiles with the Colorchecker24, or used on the web.\n If you have very high gamut images (some flowers, artificial colors), then it may be necessary to use the entire CIExy diagram, the profile used will be ACESP0. In this second case, the number of colors that can be used in internal to the algorithm will be more important. -!TP_WBALANCE_ITCWGREEN;Green refinement -!TP_WBALANCE_ITCWGREEN_TOOLTIP;Allows you to change the "tint" (green) which will serve as a reference when starting the algorithm. It has substantially the same role for greens as "AWB temperature bias" for temperature.\nThe whole algorithm is recalculated. -!TP_WBALANCE_ITCWPRIM_TOOLTIP;Allows you to select the image sampling.\n'Close to full CIE diagram' almost uses the data present on the sensor, possibly including the imaginary colors.\n'Camera XYZ matrix' - uses the matrix directly derived from Color Matrix.\n'Medium sampling' (default) - near Pointer's gamut: corresponds substantially to the most common cases of human vision.\nThe other choice 'Low sampling and Ignore camera settings' allow you to isolate high gamut parts of the image and forces the algorithm in some cases (tint > 0.8,...) to ignore camera settings. This will obviously have an impact on the result.\n\nThis sampling only has an influence on the channel multipliers, it has nothing to do with the "working profile" and does not modify the gamut of the image. -!TP_WBALANCE_ITCWSAMPLING_TOOLTIP;Allows you to use the old sampling algorithm to ensure better compatibility with 5.9. You must enable Observer 10° (default). -!TP_WBALANCE_MULLABEL;Multipliers: r=%1 g=%2 b=%3 -!TP_WBALANCE_MULLABEL_TOOLTIP;Values given for information purposes. You cannot change them. -!TP_WBALANCE_OBSERVER10;Observer 10° instead of Observer 2° -!TP_WBALANCE_OBSERVER10_TOOLTIP;The color management in Rawtherapee (White balance, channel multipliers, highlight recovery,...) uses the spectral data of the illuminants and colors. Observer is an important parameter of this management which takes into account the angle of perception of the eye. In 1931 it was fixed at 2° (privileges the use of the cones). In 1964 it was fixed at 10° (privileges the use of the cones, but partially takes into account the rods).\nTo avoid a (rare) drift of the colors due to the choice Observer 10° - probably due to the conversion matrix - Observer 2° must be selected.\nIn a majority of cases Observer 10° (default) will be a more relevant choice. -!TP_WBALANCE_PATCHLABEL;Read colors:%1 Patch: Chroma:%2 Size=%3 -!TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colors (max=237).\nDisplay calculated Patch Chroma.\nAWB temperature bias, lets try to reduce this value, a minimum may seem to optimize the algorithm.\n\nPatch size matching chroma optimization. -!TP_WBALANCE_PATCHLEVELLABEL;Patch: ΔE=%1 - datas x 9 Min:%2 Max=%3 -!TP_WBALANCE_PATCHLEVELLABEL_TOOLTIP;Display ΔE patch (this assumes there is enough spectral data), between image and spectral datas.\n Display read datas found. The 2 values correspond to the minimum and maximum data values taken into account. The coefficient x9 must be taken into account to obtain the number of pixels concerned in the image. -!TP_WBALANCE_STUDLABEL0;Correlation factor: %1 Passes:%2 Alt=%3 -!TP_WBALANCE_STUDLABEL1;Correlation factor: %1 Passes:%2 Best_alt=%3 !//TP_WBALANCE_ITCWBNOPURPLE_TOOLTIP;By default when "Inpaint opposed" is activated, purple colors are not taken into account. However, if the image does not need highlight reconstruction, or if this image naturally contains purple tints (flowers, etc.), it may be necessary to deactivate, to take into account all the colors. !//TP_WBALANCE_ITCWB_FORCED;Forces use of the entire CIE diagram From 0d9bafdc887b4fe90c99ad0bff4687776468ebc0 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Sat, 30 Mar 2024 17:05:11 +0100 Subject: [PATCH 38/78] dcraw: add panasonic v8 decoder. Port panasonic v8 decoder from libraw. * Extract data required for the decoder from the panasonic custom exif tags * Add panasonic v8 decoder --- rtengine/dcraw.cc | 125 ++++++++- rtengine/dcraw.h | 38 ++- rtengine/panasonic_decoders.cc | 486 ++++++++++++++++++++++++++++++++- 3 files changed, 630 insertions(+), 19 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 6a9674faa..2b2d36013 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -6458,16 +6458,123 @@ int CLASS parse_tiff_ifd (int base) FORC3 cam_mul[c] = get2(); break; case 45: - if (pana_raw && len == 1 && type == 3) - { - RT_pana_info.encoding = get2(); - } - break; + if (pana_raw && len == 1 && type == 3) { + RT_pana_info.encoding = get2(); + } + break; case 46: - if (type != 7 || fgetc(ifp) != 0xff || fgetc(ifp) != 0xd8) break; - thumb_offset = ftell(ifp) - 2; - thumb_length = len; - break; + if (type != 7 || fgetc(ifp) != 0xff || fgetc(ifp) != 0xd8) break; + thumb_offset = ftell(ifp) - 2; + thumb_length = len; + break; + case 57: + if (pana_raw && len == 26 && type == 7) { + ushort cnt = get2(); + if (cnt > 6) cnt = 6; + for (i = 0; i < cnt; i++) + RT_pana_info.v8tags.tag39[i] = get4(); + } + break; + case 58: + if (pana_raw && type == 7 && len == 26) { + ushort cnt = get2(); + if (cnt > 6) cnt = 6; + for (i = 0; i < cnt; i++) { + get2(); + RT_pana_info.v8tags.tag3A[i] = get2(); + } + } + break; + case 59: + if (pana_raw && type == 3 && len == 1) + RT_pana_info.v8tags.tag3B = get2(); + break; + case 60: + case 61: + case 62: + case 63: + if (pana_raw && type == 3 && len == 1) + RT_pana_info.v8tags.initial[tag - 0x3c] = get2(); + break; + case 64: + if (pana_raw && type == 7 && len == 70) { + ushort count = get2(); + if (count > 17) count = 17; + for (i = 0; i < count; i++) { + ushort v1 = get2(); + if (v1 > 16u) v1 = 16u; + RT_pana_info.v8tags.tag40a[i] = v1; + ushort v2 = get2(); + if (v2 > 0xfffu) v2 = 0xfffu; + RT_pana_info.v8tags.tag40b[i] = v2; + } + } + break; + case 65: + if (pana_raw && type == 7 && len == 36) { + ushort count = get2(); + if (count > 17) count = 17; + for (i = 0; i < count; i++) { + ushort v1 = get2(); + if (v1 > 0x40u) v1 = 64; + RT_pana_info.v8tags.tag41[i] = v1; + } + } + break; + case 66: + if (pana_raw && type == 3 && len == 1) { + ushort val = get2(); + if (val > 5) val = 5; + RT_pana_info.v8tags.stripe_count = val; + } + break; + case 67: + if (pana_raw && type == 3 && len == 1) { + ushort val = get2(); + if (val > 5) val = 5; + RT_pana_info.v8tags.tag43 = val; + } + break; + case 68: + if (pana_raw && type == 7 && len == 50) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_offsets[i] = get4(); + } + break; + case 69: + if (pana_raw && type == 7 && len == 50) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_left[i] = get4(); + } + break; + case 70: + if (pana_raw && type == 7 && len == 50) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_compressed_size[i] = get4(); + } + break; + case 71: + if (pana_raw && type == 7 && len == 26) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_width[i] = get2(); + } + break; + case 72: + if (pana_raw && type == 7 && len == 26) { + ushort count = get2(); + if (count > 5) count = 5; + for (i = 0; i < count; i++) + RT_pana_info.v8tags.stripe_height[i] = get2(); + } + break; case 61440: /* Fuji HS10 table */ fseek (ifp, get4()+base, SEEK_SET); parse_tiff_ifd (base); diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index eaf87d618..30fce90e3 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -192,12 +192,6 @@ protected: std::string RT_software; double RT_baseline_exposure; - struct PanasonicRW2Info { - ushort bpp; - ushort encoding; - PanasonicRW2Info(): bpp(0), encoding(0) {} - }; - PanasonicRW2Info RT_pana_info; std::vector gainMaps; public: @@ -229,6 +223,29 @@ public: short CR3_CTMDtag; }; + struct PanasonicRW2Info { + struct v8_tags_t + { + uint32_t tag39[6]; + uint16_t tag3A[6]; + uint16_t tag3B; + uint16_t initial[4]; + uint16_t tag40a[17], tag40b[17], tag41[17]; + uint16_t stripe_count; // 0x42 + uint16_t tag43; + int64_t stripe_offsets[5]; //0x44 + uint16_t stripe_left[5]; // 0x45 + uint32_t stripe_compressed_size[5]; //0x46 + uint16_t stripe_width[5]; //0x47 + uint16_t stripe_height[5]; + }; + + ushort bpp; + ushort encoding; + v8_tags_t v8tags; + PanasonicRW2Info(): bpp(0), encoding(0), v8tags{} {} + }; + bool isBayer() const { return (filters != 0 && filters != 9); @@ -250,9 +267,11 @@ public: protected: CanonCR3Data RT_canon_CR3_data; - + CanonLevelsData RT_canon_levels_data; + PanasonicRW2Info RT_pana_info; + float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; void (DCraw::*write_thumb)(); @@ -411,7 +430,9 @@ void fuji_decode_strip (fuji_compressed_params* params, int cur_block, INT64 raw void fuji_compressed_load_raw(); void fuji_decode_loop(fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes, uchar *q_bases); void parse_fuji_compressed_header(); -void fuji_14bit_load_raw(); +void fuji_14bit_load_raw(); +void pana8_decode_loop(void *data); +bool pana8_decode_strip(void* data, int stream); void pentax_load_raw(); void nikon_load_raw(); int nikon_is_compressed(); @@ -503,6 +524,7 @@ private: void panasonicC6_load_raw(); void panasonicC7_load_raw(); +void panasonicC8_load_raw(); void canon_rmf_load_raw(); void panasonic_load_raw(); diff --git a/rtengine/panasonic_decoders.cc b/rtengine/panasonic_decoders.cc index 62bac4526..5211b09b8 100644 --- a/rtengine/panasonic_decoders.cc +++ b/rtengine/panasonic_decoders.cc @@ -13,14 +13,17 @@ * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . -*/ + */ #include +#include #include "dcraw.h" +#include "rt_math.h" + // Code adapted from libraw /* -*- C++ -*- - * Copyright 2019 LibRaw LLC (info@libraw.org) + * Copyright (C) 2022-2024 Alex Tutubalin, LibRaw LLC * LibRaw is free software; you can redistribute it and/or modify it under the terms of the one of two licenses as you choose: @@ -33,6 +36,431 @@ */ +namespace +{ + +using pana8_tags_t = DCraw::PanasonicRW2Info::v8_tags_t; +using ushort = DCraw::ushort; +using INT64 = DCraw::INT64; + +// in 8-byte words, 800kb +#define PANA8_BUFSIZE 102400 + +class pana8_bufio_t +{ +public: + pana8_bufio_t(rtengine::IMFILE *stream, INT64 start, uint32_t len) : + data(PANA8_BUFSIZE), input(stream), baseoffset(start), begin(0), end(0), _size(len) + { + } + uint32_t size() { return ((_size + 7) / 8) * 8; } + uint64_t getQWord(uint32_t offset) + { + if (offset >= begin && offset < end) + return data[offset - begin]; + if (!input) return 0; + refill(offset); + if (offset >= begin && offset < end) + return data[offset - begin]; + return 0; + } + void refill(uint32_t newoffset); + + std::vector data; + rtengine::IMFILE *input; + INT64 baseoffset; + INT64 begin, end; + uint32_t _size; +}; + +struct pana8_param_t { + uint32_t range_shift, gamma_base; + uint32_t tag3A[6]; + uint32_t tag39[6]; + uint32_t tag3B; + uint32_t initial[4]; + uint32_t huff_coeff[17]; + uint32_t tag3B_2; + uint32_t noGammaFlag; + uint64_t hufftable1[17]; + uint64_t hufftable2[17]; + std::vector gammaTable; + std::vector extrahuff; + + pana8_param_t(const pana8_tags_t &init); + int32_t gammaCurve(uint32_t i); + bool DecodeC8( + pana8_bufio_t &bufio, + unsigned int width, unsigned int height, ushort *raw_image, ushort raw_width, ushort raw_height, uint16_t left_margin); + uint32_t GetDBit(uint64_t a2); +}; + +void invertBits(void *buf, size_t size); + +void pana8_bufio_t::refill(uint32_t newoffset) +{ + if (newoffset >= begin && newoffset < end) + return; + uint32_t readwords, remainwords, toread; +#ifdef _OPENMP +#pragma omp critical + { +#endif + fseek(input, baseoffset + newoffset * sizeof(int64_t), SEEK_SET); + remainwords = (_size - newoffset * sizeof(int64_t) + 7) >> 3; + toread = MIN(PANA8_BUFSIZE, remainwords); + uint32_t readbytes = fread(data.data(), 1, toread * sizeof(uint64_t), input); + readwords = (readbytes + 7) >> 3; +#ifdef _OPENMP + } +#endif + + if (INT64(readwords) < INT64(toread) - 1LL) + throw std::runtime_error("Unexpected end of file in CRX bitstream"); + + if (readwords > 0) + invertBits(data.data(), readwords * sizeof(uint64_t)); + begin = newoffset; + end = newoffset + readwords; +} + +struct pana8_base_t { + pana8_base_t() { coeff[0] = coeff[1] = coeff[2] = coeff[3] = 0; } + pana8_base_t(const pana8_base_t &s) { clone(s.coeff); } + void clone(const uint32_t *scoeff) + { // TODO: implement SSE load for SSE-enabled code + coeff[0] = scoeff[0]; + coeff[1] = scoeff[1]; + coeff[2] = scoeff[2]; + coeff[3] = scoeff[3]; + } + uint32_t coeff[4]; +}; + +bool pana8_param_t::DecodeC8(pana8_bufio_t &bufio, unsigned int width, unsigned int height, ushort *raw_image, ushort raw_width, ushort raw_height, uint16_t left_margin) +{ + unsigned halfwidth = width >> 1; + unsigned halfheight = height >> 1; + if (!halfwidth || !halfheight || bufio.size() < 9) + return false; // invalid input + + uint32_t datamax = tag3B_2 >> range_shift; + + pana8_base_t start_coeff; + for (int i = 0; i < 4; i++) + start_coeff.coeff[i] = initial[i] & 0xffffu; + + bool _extrahuff = (extrahuff.size() >= 0x10000); + + uint8_t *big_huff_table = nullptr; + if (_extrahuff) + big_huff_table = extrahuff.data(); + + uint16_t *gammatable = (gammaTable.size() >= 0x10000) && !noGammaFlag ? (uint16_t *)gammaTable.data() : 0; + +#ifdef PANA8_FULLY_BUFFERED + const uint8_t *inputbyteptr = source.data(); + uint32_t jobsz_in_qwords = source.size() >> 3; +#else + uint32_t jobsz_in_qwords = bufio.size() >> 3; +#endif + int32_t doublewidth = 4 * halfwidth; + std::vector outline(4 * doublewidth); + pana8_base_t line_base(start_coeff); + int64_t bittail = 0LL; + int32_t bitportion = 0; + uint32_t inqword = 0u; + + try { + for (uint32_t current_row = 0; current_row < halfheight; current_row++) { + uint8_t *outrowp = outline.data(); + pana8_base_t current_base(line_base); + + for (int32_t col = 0; col < doublewidth; col++) { + uint64_t pixbits; + if (bitportion < 0) { + uint32_t inqword_next = inqword + 1; + if ((int)inqword + 1 >= int(jobsz_in_qwords)) + return false; + bitportion += 64; + uint64_t inputqword = bufio.getQWord(inqword); + uint64_t inputqword_next = bufio.getQWord(inqword_next); + pixbits = (inputqword_next >> bitportion) | (inputqword << (64 - (uint8_t)(bitportion & 0xffu))); + if ((unsigned int)inqword < jobsz_in_qwords) + inqword = inqword_next; + } else { + if ((unsigned int)inqword >= jobsz_in_qwords) + return false; + uint64_t inputqword = bufio.getQWord(inqword); + pixbits = (inputqword >> bitportion) | bittail; + uint32_t step = (bitportion == 0); + if (!bitportion) + bitportion = 64; + inqword += step; + } + int huff_index = 0; + if (_extrahuff) { + huff_index = *(uint8_t *)(big_huff_table + ((pixbits >> 48) & 0xffffu)); + } else { + huff_index = int(GetDBit(pixbits)); + datamax = tag3B_2; + } + int32_t v37 = (huff_coeff[huff_index] >> 24) & 0x1F; + uint32_t hc = huff_coeff[huff_index]; + int64_t v38 = pixbits << (((hc >> 16) & 0xffffu) & 0x1F); + uint64_t v90 = (uint32_t)(huff_index - v37); + int32_t v39 = (uint16_t)((uint64_t)v38 >> ((uint8_t)v37 - (uint8_t)huff_index)) << ((huff_coeff[huff_index] >> 24) & 0xffu); + + if (huff_index - v37 <= 0) + v39 &= 0xffff0000u; + + int32_t delta1; + if (v38 < 0) { + delta1 = (uint16_t)v39; + } else if (huff_index) { + int32_t v40 = -1 << huff_index; + if ((uint8_t)v37) + delta1 = (uint16_t)v39 + v40; + else + delta1 = (uint16_t)v39 + v40 + 1; + } else { + delta1 = 0; + } + + uint32_t v42 = bitportion - ((huff_coeff[huff_index] >> 16) & 0x1F); + int32_t delta2 = uint8_t(v37) ? 1 << (v37 - 1) : 0; + uint32_t *destpixel = (uint32_t *)(outrowp + 16LL * (col >> 2)); + + int32_t delta = delta1 + delta2; + int32_t col_amp_3 = col & 3; + if (col_amp_3 == 2) { + int32_t val = current_base.coeff[1] + delta; + destpixel[1] = uint32_t(rtengine::LIM(val, 0, int(datamax))); + } else if (col_amp_3 == 1) { + int32_t val = current_base.coeff[2] + delta; + destpixel[2] = uint32_t(rtengine::LIM(val, 0, int(datamax))); + } else if ((col & 3) != 0) { // == 3 + int32_t val = current_base.coeff[3] + delta; + destpixel[3] = uint32_t(rtengine::LIM(val, 0, int(datamax))); + } else { // 0 + int32_t val = current_base.coeff[0] + delta; + destpixel[0] = uint32_t(rtengine::LIM(val, 0, int(datamax))); + } + if (huff_index <= v37) + v90 = 0LL; + bittail = v38 << v90; + bitportion = int32_t(v42 - v90); + + if (col_amp_3 == 3) + current_base.clone((uint32_t *)(outrowp + 16LL * (col >> 2))); + if (col == 3) + line_base.clone((uint32_t *)(outrowp)); + } + + int destrow = current_row * 2; + uint16_t *destrow0 = raw_image + (destrow * raw_width) + left_margin; + uint16_t *destrow1 = + raw_image + (destrow + 1) * raw_width + left_margin; + uint16_t *srcrow = (uint16_t *)(outrowp); + if (gammatable) { + for (unsigned col = 0; col < width - 1; col += 2) { + const int c6 = col * 4; + destrow0[col] = gammatable[srcrow[c6]]; + destrow0[col + 1] = gammatable[srcrow[c6 + 2]]; + destrow1[col] = gammatable[srcrow[c6 + 4]]; + destrow1[col + 1] = gammatable[srcrow[c6 + 6]]; + } + } else { + for (unsigned col = 0; col < width - 1; col += 2) { + const int c6 = col * 4; + destrow0[col] = srcrow[c6]; + destrow0[col + 1] = srcrow[c6 + 2]; + destrow1[col] = srcrow[c6 + 4]; + destrow1[col + 1] = srcrow[c6 + 6]; + } + } + } + } catch (...) { // buffer read may throw an exception + return false; + } + + return true; +} + +uint32_t pana8_param_t::GetDBit(uint64_t a2) +{ + for (int i = 0; i < 16; i++) { + if ((a2 & hufftable2[i]) == hufftable1[i]) + return i; + } + + return uint32_t((hufftable2[16] & a2) == hufftable1[16]) ^ 0x11u; +} + +pana8_param_t::pana8_param_t(const pana8_tags_t &meta) : + gammaTable(0) +{ + range_shift = gamma_base = tag3B = 0; + + memset(tag3A, 0, sizeof(tag3A)); + memset(tag39, 0, sizeof(tag3A)); + memset(tag3A, 0, sizeof(tag3A)); + memset(initial, 0, sizeof(tag3A)); + memset(huff_coeff, 0, sizeof(tag3A)); + memset(hufftable1, 0, sizeof(tag3A)); + memset(hufftable2, 0, sizeof(tag3A)); + + noGammaFlag = 1; + + for (int i = 0; i < 6; i++) { + tag3A[i] = meta.tag3A[i]; + tag39[i] = meta.tag39[i]; + } + + tag3B_2 = tag3B = meta.tag3B; + + for (int i = 0; i < 4; i++) + initial[i] = meta.initial[i]; + + for (int i = 0; i < 17; i++) + huff_coeff[i] = (uint32_t(meta.tag41[i]) << 24) | (uint32_t(meta.tag40a[i]) << 16) | meta.tag40b[i]; + + std::vector tempGamma(0x10000); + for (unsigned i = 0; i < 0x10000; i++) { + uint64_t val = gammaCurve(i); + tempGamma[i] = uint16_t(val & 0xffffu); + if (i != val) + noGammaFlag = 0; + } + + if (!noGammaFlag) + gammaTable = tempGamma; + + int v7 = 0; + + for (unsigned hindex = 0; hindex < 17; hindex++) { + uint32_t hc = huff_coeff[hindex]; + uint32_t hlow = (hc >> 16) & 0x1F; + int16_t v8 = 0; + if ((hc & 0x1F0000) != 0) { + int h7 = ((hc >> 16) & 0xffffu) & 7; + if (hlow - 1 >= 7) { + uint32_t hdiff = h7 - hlow; + v8 = 0; + do { + v8 = (v8 << 8) | 0xFFu; + hdiff += 8; + } while (hdiff); + } else { + v8 = 0; + } + for (; h7; --h7) { + v8 = 2 * v8 + 1; + } + } + + uint16_t v9 = hc & v8; + if (uint32_t(v7) < hlow) { + v7 = ((huff_coeff[hindex] >> 16) & 0xFFFFu) & 0x1F; + } + hufftable2[hindex] = 0xFFFFULL << (64 - hlow); + hufftable1[hindex] = (uint64_t)v9 << (64 - hlow); + } + + if (v7 < 17) { + if (extrahuff.size() < 0x10000) + extrahuff.resize(0x10000); + uint64_t v17 = 0LL; + + for (int j = 0LL; j < 0x10000; ++j) { + extrahuff[j] = uint8_t(GetDBit(v17) & 0xffu); + v17 += 0x1000000000000ULL; + } + } +} + +int32_t pana8_param_t::gammaCurve(uint32_t idx) +{ + unsigned int v2 = idx | 0xFFFF0000; + if ((idx & 0x10000) == 0) + v2 = idx & 0x1FFFF; + + int v3 = gamma_base + v2; + unsigned int v4 = MIN(v3, 0xFFFF); + + int v5 = 0; + if ((v4 & 0x80000000) != 0) + v4 = 0; + + if (v4 >= (0xFFFF & tag3A[1])) { + v5 = 1; + if (v4 >= (0xFFFF & tag3A[2])) { + v5 = 2; + if (v4 >= (0xFFFF & tag3A[3])) { + v5 = 3; + if (v4 >= (0xFFFF & tag3A[4])) + v5 = ((v4 | 0x500000000LL) - (uint64_t)(0xFFFF & tag3A[5])) >> 32; + } + } + } + unsigned int v6 = tag3A[v5]; + int v7 = tag39[v5]; + unsigned int v8 = v4 - (uint16_t)v6; + char v9 = v7 & 0x1F; + int64_t result = 0; + + if (v9 == 31) { + result = v5 == 5 ? 0xFFFFLL : ((tag3A[v5 + 1] >> 16) & 0xFFFF); + return MIN(uint32_t(result), tag3B); + } + if ((v7 & 0x10) == 0) { + if (v9 == 15) { + result = ((v6 >> 16) & 0xFFFF); + return MIN(uint32_t(result), tag3B); + } else if (v9 != 0) { + v8 = (v8 + (1 << (v9 - 1))) >> v9; + } + } else { + v8 <<= v7 & 0xF; + } + + result = v8 + ((v6 >> 16) & 0xFFFF); + + return MIN(uint32_t(result), tag3B); +} + +const static uint8_t _bitRevTable[256] = { + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, + 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, + 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, + 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, + 0x32, 0xB2, 0x72, 0xF2, 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, + 0xFA, 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, + 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1, 0x21, + 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, + 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, + 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, + 0x7D, 0xFD, 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 0x0B, + 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, + 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, + 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF}; + +void invertBits(void *buf, size_t size) +{ + unsigned sz = unsigned(size / 8); + uint64_t *ptr = static_cast(buf); + for (unsigned i = 0; i < sz; i++) { + uint8_t *b = reinterpret_cast(&ptr[i]); + uint64_t r = ((uint64_t)_bitRevTable[b[0]] << 56) | ((uint64_t)_bitRevTable[b[1]] << 48) | + ((uint64_t)_bitRevTable[b[2]] << 40) | ((uint64_t)_bitRevTable[b[3]] << 32) | + ((uint64_t)_bitRevTable[b[4]] << 24) | ((uint64_t)_bitRevTable[b[5]] << 16) | + ((uint64_t)_bitRevTable[b[6]] << 8) | _bitRevTable[b[7]]; + ptr[i] = r; + } +} + +} // namespace + unsigned DCraw::pana_bits_t::operator() (int nbits, unsigned *bytes) { int byte; @@ -177,6 +605,8 @@ void DCraw::panasonic_load_raw() panasonicC6_load_raw(); } else if (RT_pana_info.encoding == 7) { panasonicC7_load_raw(); + } else if (RT_pana_info.encoding == 8) { + panasonicC8_load_raw(); } else { pana_bits_t pana_bits(ifp, load_flags, RT_pana_info.encoding); pana_bits(0, 0); @@ -321,3 +751,55 @@ void DCraw::panasonicC7_load_raw() free(iobuf); tiff_bps = RT_pana_info.bpp; } + +void DCraw::panasonicC8_load_raw() +{ + int errs = 0; + unsigned totalw = 0; + + if (RT_pana_info.v8tags.stripe_count > 5) errs++; + for (int i = 0; i < RT_pana_info.v8tags.stripe_count && i < 5; i++) { + if (RT_pana_info.v8tags.stripe_height[i] != raw_height) + errs++; + if (RT_pana_info.v8tags.stripe_offsets[i] < 0 || (RT_pana_info.v8tags.stripe_offsets[i] + INT64((RT_pana_info.v8tags.stripe_compressed_size[i] + 7u) / 8u)) > INT64(ifp->size)) + errs++; + totalw += RT_pana_info.v8tags.stripe_width[i]; + } + if (totalw != raw_width) errs++; + + if (errs) + derror(); + + pana8_param_t pana8_param(RT_pana_info.v8tags); + pana8_decode_loop(&pana8_param); +} + +void DCraw::pana8_decode_loop(void *data) +{ +#ifdef _OPENMP + int errs = 0, scount = MIN(5, RT_pana_info.v8tags.stripe_count); +#pragma omp parallel for + for (int stream = 0; stream < scount; stream++) { + if (!pana8_decode_strip(data, stream)) + errs++; + } + if (errs) + derror(); +#else + for (int stream = 0; stream < RT_pana_info.v8tags.stripe_count && stream < 5; stream++) + if (!pana8_decode_strip(data, stream)) + derror(); +#endif +} + +bool DCraw::pana8_decode_strip(void *data, int stream) +{ + pana8_param_t *pana8_param = (pana8_param_t *)data; + if (!data || stream < 0 || stream > 4 || stream > RT_pana_info.v8tags.stripe_count) return 1; // error + + unsigned exactbytes = (RT_pana_info.v8tags.stripe_compressed_size[stream] + 7u) / 8u; + pana8_bufio_t bufio(ifp, RT_pana_info.v8tags.stripe_offsets[stream], exactbytes); + return pana8_param->DecodeC8(bufio, RT_pana_info.v8tags.stripe_width[stream], + RT_pana_info.v8tags.stripe_height[stream], raw_image, raw_width, raw_height, + RT_pana_info.v8tags.stripe_left[stream]); +} From 3b4642fd07bd3d7d88feb3c07c3075cf2390a152 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Sat, 30 Mar 2024 17:18:25 +0100 Subject: [PATCH 39/78] dcraw: add Panasonic DC-S5M2 and DC-S5M2X to adobe_coeffs --- rtengine/dcraw.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 2b2d36013..cfb949b86 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -8996,6 +8996,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-S5M2", 0, 0, /* DC-S5M2, DC-S5M2X */ + { 10308,-4206,-783,-4088,12102,2229,-125,1051,5912 } }, { "Panasonic DC-G9M2", 0, 0, { 8325,-3456,-623,-4330,12089,2528,-860,2646,5984 } }, { "Panasonic DC-G9", 15, 0xfff, From fab4b4f614b47890f21cf54df8f8654980ac7204 Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Sat, 1 Jun 2024 17:15:20 -0700 Subject: [PATCH 40/78] Upgrade deprecated GitHub actions Actions based on Node.js 16 are deprecated. The following must be upgraded one major version. - actions/checkout@v3 - actions/cache@v3 - actions/upload-artifact@v3 - softprops/action-gh-release@v1 --- .github/workflows/appimage.yml | 10 +++++----- .github/workflows/codeql.yml | 2 +- .github/workflows/macos.yml | 6 +++--- .github/workflows/windows.yml | 14 +++++++------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index e144f4189..bbdd2f383 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -26,7 +26,7 @@ jobs: build_type: [release, debug] steps: - name: Checkout source - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -150,7 +150,7 @@ jobs: - name: Restore AppImage tools from cache id: appimage-tools-cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: key: appimage-tools-1 path: | @@ -203,7 +203,7 @@ jobs: echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $GITHUB_ENV - name: Upload artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{env.ARTIFACT_NAME}}.AppImage path: ${{github.workspace}}/build/${{env.ARTIFACT_NAME}}.AppImage @@ -225,7 +225,7 @@ jobs: echo "PUBLISH_NAME=$PUBLISH_NAME" >> $GITHUB_ENV - name: Publish artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} with: tag_name: nightly-github-actions @@ -255,7 +255,7 @@ jobs: echo "PUBLISH_NAME=$PUBLISH_NAME" >> $GITHUB_ENV - name: Publish pre-dev artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{steps.prepare-publish-pre-dev.outcome == 'success'}} with: tag_name: pre-dev-github-actions diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5cb91e47a..ffcd1dd3c 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout source - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 8755f7c66..a4ed80519 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -18,7 +18,7 @@ jobs: build: runs-on: macos-12 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install dependencies run: | date -u @@ -97,7 +97,7 @@ jobs: "ARTIFACT_FILE: ${ARTIFACT_FILE}" \ "PUBLISH_NAME: ${PUBLISH_NAME}" exit - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: ${{env.ARTIFACT_FILE}} path: ${{env.ARTIFACT_PATH}} @@ -107,7 +107,7 @@ jobs: zsh -c 'echo "Build completed in $(printf "%0.2f" $(($[$(date +%s)-$(cat build/stamp)]/$((60.))))) minutes"' - name: Publish artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} with: tag_name: nightly-github-actions diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index e5f4ce166..c4de2478f 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -30,7 +30,7 @@ jobs: build_type: [release, debug] steps: - name: Checkout source - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -189,14 +189,14 @@ jobs: 7z a -tzip "%ARTIFACT_NAME%.zip" "./%ARTIFACT_NAME%" - name: Upload artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{env.ARTIFACT_NAME}} path: build\${{env.ARTIFACT_NAME}} - name: Upload installer if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{env.ARTIFACT_NAME}}.exe path: build\${{env.ARTIFACT_NAME}}.exe @@ -222,7 +222,7 @@ jobs: echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)" - name: Publish artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} with: tag_name: nightly-github-actions @@ -231,7 +231,7 @@ jobs: build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt - name: Publish installer - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}} with: tag_name: nightly-github-actions @@ -263,7 +263,7 @@ jobs: echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)" - name: Publish pre-dev artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{steps.prepare-publish-pre-dev.outcome == 'success'}} with: tag_name: pre-dev-github-actions @@ -272,7 +272,7 @@ jobs: build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt - name: Publish pre-dev installer - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: ${{steps.prepare-publish-pre-dev.outcome == 'success' && matrix.build_type == 'release'}} with: tag_name: pre-dev-github-actions From 21c7d828be58073731b6b3ca17410121ebc77385 Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Sat, 1 Jun 2024 18:00:25 -0700 Subject: [PATCH 41/78] Fix opening image in existing window on Windows Include gdbus.exe in the installer. This allows RawTherapee to detect running instances of itself and tell it to open an image instead of launching a new instance. --- tools/win/InnoSetup/WindowsInnoSetup.iss.in | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/win/InnoSetup/WindowsInnoSetup.iss.in b/tools/win/InnoSetup/WindowsInnoSetup.iss.in index f95657bd7..aa30ad2a5 100644 --- a/tools/win/InnoSetup/WindowsInnoSetup.iss.in +++ b/tools/win/InnoSetup/WindowsInnoSetup.iss.in @@ -119,6 +119,7 @@ Source: "{#MyBuildBasePath}\options"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\*.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper-console.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#MyBuildBasePath}\gdbus.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gdb.exe"; DestDir: "{app}"; Flags: skipifsourcedoesntexist ignoreversion ;Source: "{#MyBuildBasePath}\fonts\DroidSansMonoSlashed.ttf"; DestDir: "{fonts}"; FontInstall: "Droid Sans Mono Slashed"; Flags: onlyifdoesntexist uninsneveruninstall ; NOTE: Don't use "Flags: ignoreversion" on any shared system files From 324f488f5b0a6b5ce841e0f780f5cd595b1d34bf Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Sat, 1 Jun 2024 18:59:42 -0700 Subject: [PATCH 42/78] Fix jpg file not writable after save Use a unique_ptr to automatically close the jpg file after. --- rtengine/imageio.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index f096213dc..85afb08ea 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -480,7 +480,11 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) int ImageIO::loadJPEG (const Glib::ustring &fname) { - FILE *file = g_fopen(fname.c_str (), "rb"); + std::unique_ptr file( + g_fopen(fname.c_str(), "rb"), + [](FILE *f) { + fclose(f); + }); if (!file) { return IMIO_CANNOTREADFILE; @@ -491,7 +495,7 @@ int ImageIO::loadJPEG (const Glib::ustring &fname) cinfo.err = my_jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); - my_jpeg_stdio_src (&cinfo, file); + my_jpeg_stdio_src (&cinfo, file.get()); #if defined( _WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if ( __builtin_setjmp((reinterpret_cast(cinfo.src))->error_jmp_buf) == 0 ) { @@ -553,7 +557,7 @@ int ImageIO::loadJPEG (const Glib::ustring &fname) jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); - fclose(file); + file.reset(); if (pl) { pl->setProgressStr ("PROGRESSBAR_READY"); From 5d75c44287aa5d6452ff74447fbe1c7063bf79d8 Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Sun, 2 Jun 2024 17:38:36 -0700 Subject: [PATCH 43/78] Add Fujifilm X-H2S color matrix and raw crop --- rtengine/camconst.json | 5 +++++ rtengine/dcraw.cc | 2 ++ 2 files changed, 7 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index b80d776b8..65e57929a 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1539,6 +1539,11 @@ Camera constants: "ranges": { "white": 3838 } }, + { // Quality B + "make_model": [ "Fujifilm X-H2S" ], + "raw_crop": [ 0, 5, 6264, 4176 ] + }, + { // Quality B "make_model": [ "FUJIFILM X-T10", "FUJIFILM X-E2" ], "dcraw_matrix": [ 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 ], // DNG D65 diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index cfb949b86..cef0e9fff 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -8463,6 +8463,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-H2S", 0, 0, + { 12836, -5909, -1032, -3087, 11132, 2236, -35, 872, 5330 } }, { "Fujifilm X-M1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-S1", 0, 0, From 29f4f37cdb114e86e7e8d8ee5a34f126bf10905d Mon Sep 17 00:00:00 2001 From: xiota Date: Mon, 10 Jun 2024 04:23:19 +0000 Subject: [PATCH 44/78] Enable extensions that are missing from config --- rtdata/options/options.lin | 4 ++-- rtdata/options/options.osx | 4 ++-- rtdata/options/options.win | 4 ++-- rtgui/options.cc | 29 +++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index 2a96c6997..18cb01901 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;jxl;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions= +ParseExtensionsEnabled= [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index eff9cd8d9..8d954529f 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -13,8 +13,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;jxl;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions= +ParseExtensionsEnabled= [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.win b/rtdata/options/options.win index e3f43343e..a88cc3db2 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;jxl;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions= +ParseExtensionsEnabled= [Output] PathTemplate=%p1/converted/%f diff --git a/rtgui/options.cc b/rtgui/options.cc index c96febe86..643012dfe 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -1268,6 +1268,35 @@ void Options::readFromFile(Glib::ustring fname) } } + // check and add extensions that are missing from config + static const std::vector extensions_known = { + "3fr", "arw", "arq", "cr2", "cr3", "crf", "crw", "dcr", "dng", + "fff", "iiq", "jpg", "jpeg", "jxl", "kdc", "mef", "mos", "mrw", + "nef", "nrw", "orf", "ori", "pef", "png", "raf", "raw", "rw2", + "rwl", "rwz", "sr2", "srf", "srw", "tif", "tiff", "x3f"}; + + std::map extensions_checked; + + if (parseExtensions.size() == parseExtensionsEnabled.size()) { + for (auto i = 0; i < parseExtensions.size(); ++i) { + extensions_checked[parseExtensions[i]] = parseExtensionsEnabled[i]; + } + } + + parseExtensions.clear(); + parseExtensionsEnabled.clear(); + + for (auto const &i : extensions_known) { + if (extensions_checked.count(i) == 0) { + extensions_checked[i] = 1; + } + } + + for (auto const &x : extensions_checked) { + parseExtensions.emplace_back(x.first); + parseExtensionsEnabled.emplace_back(x.second); + } + if (keyFile.has_key("File Browser", "ThumbnailArrangement")) { fbArrangement = keyFile.get_integer("File Browser", "ThumbnailArrangement"); } From 8503d5323e5b05dc79c583d59de395e4d1544714 Mon Sep 17 00:00:00 2001 From: xiota Date: Mon, 10 Jun 2024 13:46:17 +0000 Subject: [PATCH 45/78] Fix whitespace/formatting --- rtgui/options.cc | 16 ++++++++-------- rtgui/options.h | 6 +++--- rtgui/preferences.cc | 13 +++++++------ 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 643012dfe..af40595aa 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -471,7 +471,7 @@ void Options::setDefaults() curvebboxpos = 1; complexity = 2; spotmet = 0; - + inspectorWindow = false; zoomOnScroll = true; prevdemo = PD_Sidecar; @@ -580,8 +580,8 @@ void Options::setDefaults() rtSettings.darkFramesPath = ""; rtSettings.flatFieldsPath = ""; - rtSettings.cameraProfilesPath = ""; - rtSettings.lensProfilesPath = ""; + rtSettings.cameraProfilesPath = ""; + rtSettings.lensProfilesPath = ""; #ifdef _WIN32 const gchar* sysRoot = g_getenv("SystemRoot"); // Returns e.g. "c:\Windows" @@ -673,8 +673,8 @@ void Options::setDefaults() lastIccDir = rtSettings.iccDirectory; lastDarkframeDir = rtSettings.darkFramesPath; lastFlatfieldDir = rtSettings.flatFieldsPath; - lastCameraProfilesDir = rtSettings.cameraProfilesPath; - lastLensProfilesDir = rtSettings.lensProfilesPath; + lastCameraProfilesDir = rtSettings.cameraProfilesPath; + lastLensProfilesDir = rtSettings.lensProfilesPath; // rtSettings.bw_complementary = true; // There is no reasonable default for curves. We can still suppose that they will take place // in a subdirectory of the user's own ProcParams presets, i.e. in a subdirectory @@ -816,7 +816,7 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.cameraProfilesPath = keyFile.get_string("General", "CameraProfilesPath"); } - if (keyFile.has_key("General", "LensProfilesPath")) { + if (keyFile.has_key("General", "LensProfilesPath")) { rtSettings.lensProfilesPath = keyFile.get_string("General", "LensProfilesPath"); } @@ -2424,8 +2424,8 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_string("General", "Version", RTVERSION); keyFile.set_string("General", "DarkFramesPath", rtSettings.darkFramesPath); keyFile.set_string("General", "FlatFieldsPath", rtSettings.flatFieldsPath); - keyFile.set_string("General", "CameraProfilesPath", rtSettings.cameraProfilesPath); - keyFile.set_string("General", "LensProfilesPath", rtSettings.lensProfilesPath); + keyFile.set_string("General", "CameraProfilesPath", rtSettings.cameraProfilesPath); + keyFile.set_string("General", "LensProfilesPath", rtSettings.lensProfilesPath); keyFile.set_boolean("General", "Verbose", rtSettings.verbose); keyFile.set_integer("General", "Cropsleep", rtSettings.cropsleep); keyFile.set_double("General", "Reduchigh", rtSettings.reduchigh); diff --git a/rtgui/options.h b/rtgui/options.h index b2221e844..38f4fe896 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -331,7 +331,7 @@ public: bool overwriteOutputFile; int complexity; int spotmet; - + bool inspectorWindow; // open inspector in separate window bool zoomOnScroll; // translate scroll events to zoom @@ -472,8 +472,8 @@ public: Glib::ustring lastIccDir; Glib::ustring lastDarkframeDir; Glib::ustring lastFlatfieldDir; - Glib::ustring lastCameraProfilesDir; - Glib::ustring lastLensProfilesDir; + Glib::ustring lastCameraProfilesDir; + Glib::ustring lastLensProfilesDir; Glib::ustring lastRgbCurvesDir; Glib::ustring lastLabCurvesDir; Glib::ustring lastRetinexDir; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index d92080af8..04a9ece60 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -656,7 +656,7 @@ Gtk::Widget* Preferences::getImageProcessingPanel () Gtk::Grid* dirgrid = Gtk::manage(new Gtk::Grid()); setExpandAlignProperties(dirgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - // Dark Frames Dir + // Dark Frames Dir Gtk::Label *dfLab = Gtk::manage(new Gtk::Label(M("PREFERENCES_DIRDARKFRAMES") + ":")); setExpandAlignProperties(dfLab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); darkFrameDir = Gtk::manage(new MyFileChooserButton(M("PREFERENCES_DIRDARKFRAMES"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); @@ -705,7 +705,7 @@ Gtk::Widget* Preferences::getImageProcessingPanel () dirgrid->attach_next_to(*cameraProfilesDirLabel, *clutsDirLabel, Gtk::POS_BOTTOM, 1, 1); dirgrid->attach_next_to(*cameraProfilesDir, *cameraProfilesDirLabel, Gtk::POS_RIGHT, 1, 1); - //Lens Profiles Dir + //Lens Profiles Dir Gtk::Label *lensProfilesDirLabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_LENSPROFILESDIR") + ":")); lensProfilesDirLabel->set_tooltip_text(M("PREFERENCES_LENSPROFILESDIR_TOOLTIP")); setExpandAlignProperties(lensProfilesDirLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); @@ -1111,7 +1111,7 @@ Gtk::Widget* Preferences::getGeneralPanel() workflowGrid->attach_next_to(*curveBBoxPosL, *flayoutlab, Gtk::POS_BOTTOM, 1, 1); workflowGrid->attach_next_to(*curveBBoxPosC, *editorLayout, Gtk::POS_BOTTOM, 1, 1); workflowGrid->attach_next_to(*curveBBoxPosRestartL, *lNextStart, Gtk::POS_BOTTOM, 1, 1); - + curveBBoxPosS = Gtk::manage(new Gtk::ComboBoxText()); setExpandAlignProperties(curveBBoxPosS, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); @@ -2013,8 +2013,8 @@ void Preferences::storePreferences() moptions.curvebboxpos = curveBBoxPosC->get_active_row_number(); moptions.complexity = complexitylocal->get_active_row_number(); - moptions.spotmet = spotlocal->get_active_row_number(); - + moptions.spotmet = spotlocal->get_active_row_number(); + moptions.inspectorWindow = inspectorWindowCB->get_active(); moptions.zoomOnScroll = zoomOnScrollCB->get_active(); moptions.histogramPosition = ckbHistogramPositionLeft->get_active() ? 1 : 2; @@ -2673,10 +2673,11 @@ void Preferences::addExtPressed() Gtk::TreeNodeChildren c = extensionModel->children(); - for (size_t i = 0; i < c.size(); i++) + for (size_t i = 0; i < c.size(); i++) { if (c[i][extensionColumns.ext] == extension->get_text()) { return; } + } Gtk::TreeRow row = * (extensionModel->append()); From 7f7e808b9c07d6da896af462a8ab63146735fd74 Mon Sep 17 00:00:00 2001 From: xiota Date: Mon, 10 Jun 2024 14:03:41 +0000 Subject: [PATCH 46/78] Don't allow deleting known extensions --- rtgui/options.cc | 18 ++++++------------ rtgui/options.h | 7 +++++++ rtgui/preferences.cc | 23 ++++++++++++++++++++++- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index af40595aa..a6756d37d 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -1269,30 +1269,24 @@ void Options::readFromFile(Glib::ustring fname) } // check and add extensions that are missing from config - static const std::vector extensions_known = { - "3fr", "arw", "arq", "cr2", "cr3", "crf", "crw", "dcr", "dng", - "fff", "iiq", "jpg", "jpeg", "jxl", "kdc", "mef", "mos", "mrw", - "nef", "nrw", "orf", "ori", "pef", "png", "raf", "raw", "rw2", - "rwl", "rwz", "sr2", "srf", "srw", "tif", "tiff", "x3f"}; - - std::map extensions_checked; + std::map checkedExtensions; if (parseExtensions.size() == parseExtensionsEnabled.size()) { for (auto i = 0; i < parseExtensions.size(); ++i) { - extensions_checked[parseExtensions[i]] = parseExtensionsEnabled[i]; + checkedExtensions[parseExtensions[i]] = parseExtensionsEnabled[i]; } } parseExtensions.clear(); parseExtensionsEnabled.clear(); - for (auto const &i : extensions_known) { - if (extensions_checked.count(i) == 0) { - extensions_checked[i] = 1; + for (auto const &i : knownExtensions) { + if (checkedExtensions.count(i) == 0) { + checkedExtensions[i] = 1; } } - for (auto const &x : extensions_checked) { + for (auto const &x : checkedExtensions) { parseExtensions.emplace_back(x.first); parseExtensionsEnabled.emplace_back(x.second); } diff --git a/rtgui/options.h b/rtgui/options.h index 38f4fe896..6a2b0c35d 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -310,6 +310,13 @@ public: int maxThumbnailWidth; std::size_t maxCacheEntries; int thumbInterp; // 0: nearest, 1: bilinear + + std::vector knownExtensions = { + "3fr", "arw", "arq", "cr2", "cr3", "crf", "crw", "dcr", "dng", + "fff", "iiq", "jpg", "jpeg", "jxl", "kdc", "mef", "mos", "mrw", + "nef", "nrw", "orf", "ori", "pef", "png", "raf", "raw", "rw2", + "rwl", "rwz", "sr2", "srf", "srw", "tif", "tiff", "x3f"}; + std::vector parseExtensions; // List containing all extensions type std::vector parseExtensionsEnabled; // List of bool to retain extension or not std::vector parsedExtensions; // List containing all retained extensions (lowercase) diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 04a9ece60..97bfb92b6 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -2687,8 +2687,29 @@ void Preferences::addExtPressed() void Preferences::delExtPressed() { + const Glib::RefPtr selection = extensions->get_selection(); - extensionModel->erase(extensions->get_selection()->get_selected()); + if (!selection) { + return; + } + + const Gtk::TreeModel::iterator selected = selection->get_selected(); + + if (!selected) { + return; + } + + bool delOkay = true; + for (auto const &x : moptions.knownExtensions) { + if (x == (*selected)[extensionColumns.ext]) { + delOkay = false; + break; + } + } + + if (delOkay) { + extensionModel->erase(selected); + } } void Preferences::moveExtUpPressed() From 02e8d3f33c9cd6cd97d09f8cf9453a096b449408 Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 16 Jun 2024 02:30:40 +0000 Subject: [PATCH 47/78] Change order of image/raw loading to generate thumbnails --- rtgui/thumbnail.cc | 58 +++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 228592a70..f5098ae6d 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -248,44 +248,44 @@ void Thumbnail::_generateThumbnailImage() cfs.exifValid = false; cfs.timeValid = false; - // RAW works like this: - // 1. if we are here it's because we aren't in the cache so load the JPG - // image out of the RAW. Mark as "quick". - // 2. if we don't find that then just grab the real image. - bool quick = false; - - rtengine::eSensorType sensorType = rtengine::ST_NONE; - - if (initial_ && options.internalThumbIfUntouched) { - quick = true; - tpp = rtengine::Thumbnail::loadQuickFromRaw(fname, sensorType, tw, th, 1, TRUE); - } - - if (!tpp) { - quick = false; - tpp = rtengine::Thumbnail::loadFromRaw(fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); - } - - cfs.sensortype = sensorType; + // this will load formats supported by imagio (jpg, png, jxl, and tiff) + tpp = rtengine::Thumbnail::loadFromImage(fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); if (tpp) { - cfs.format = FT_Raw; - cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; + cfs.format = FT_Custom; infoFromImage(fname); - - if (!quick) { - cfs.width = tpp->full_width; - cfs.height = tpp->full_height; - } } if (!tpp) { - // this will load formats supported by imagio (jpg, png, jxl, and tiff) - tpp = rtengine::Thumbnail::loadFromImage(fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); + // RAW works like this: + // 1. if we are here it's because we aren't in the cache so load the JPG + // image out of the RAW. Mark as "quick". + // 2. if we don't find that then just grab the real image. + bool quick = false; + + rtengine::eSensorType sensorType = rtengine::ST_NONE; + + if (initial_ && options.internalThumbIfUntouched) { + quick = true; + tpp = rtengine::Thumbnail::loadQuickFromRaw(fname, sensorType, tw, th, 1, TRUE); + } + + if (!tpp) { + quick = false; + tpp = rtengine::Thumbnail::loadFromRaw(fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); + } + + cfs.sensortype = sensorType; if (tpp) { - cfs.format = FT_Custom; + cfs.format = FT_Raw; + cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; infoFromImage(fname); + + if (!quick) { + cfs.width = tpp->full_width; + cfs.height = tpp->full_height; + } } } From 3b2990dd78424cda3a57434fc405646cac138ced Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Tue, 11 Jun 2024 17:55:10 -0700 Subject: [PATCH 48/78] Add/update dcraw constants from LibRaw Add or update adobe_coeff constants from LibRaw public snapshot 202403. --- rtengine/dcraw.cc | 481 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 474 insertions(+), 7 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index cfb949b86..3358dc91b 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -8113,6 +8113,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11438,-3762,-1115,-2409,9914,2497,-1227,2295,5300 } }, { "Apple QuickTake", 0, 0, /* DJC */ { 21392,-5653,-3353,2406,8010,-415,7166,1427,2078 } }, + { "Broadcom RPi IMX219", 66, 0x3ff, + { 5302,1083,-728,-5320,14112,1699,-863,2371,5136 } }, /* LibRaw */ // From LibRaw + { "Broadcom RPi OV5647", 16, 0x3ff, + { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, /* DJC */ // From LibRaw + { "Broadcom Pi", 16, 0x3ff, + { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, /* DJC */ // From LibRaw { "Canon EOS D2000", 0, 0, { 24542,-10860,-3401,-1490,11370,-297,2858,-605,3225 } }, { "Canon EOS D6000", 0, 0, @@ -8151,6 +8157,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6071,-747,-856,-7653,15365,2441,-2025,2553,7315 } }, { "Canon EOS 50D", 0, 0x3d93, { 4920,616,-593,-6493,13964,2784,-1774,3178,7005 } }, + { "Canon EOS 250D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565 } }, // From LibRaw { "Canon EOS 60D", 0, 0x2ff7, { 6719,-994,-925,-4408,12426,2211,-887,2129,6051 } }, { "Canon EOS 70D", 0, 0x3bc7, @@ -8161,6 +8169,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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 250D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565 } }, // From LibRaw { "Canon EOS 200D", 0, 0, { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, { "Canon EOS 300D", 0, 0xfa0, @@ -8185,8 +8195,14 @@ 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 850D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565}}, // From LibRaw { "Canon EOS 800D", 0, 0, { 6970,-512,-968,-4425,12161,2553,-739,1982,5601 } }, + { "EOS 850D", 0, 0, + { 9079,-1923,-1236,-4677,12454,2492,-922,2319,5565}}, // From LibRaw + { "Canon EOS 90D", 0, 0, + { 11498, -3759, -1516, -5073, 12954, 2349, -892, 1867, 6118}}, // From LibRaw { "Canon EOS 1000D", 0, 0xe43, { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, { "Canon EOS 1100D", 0, 0x3510, @@ -8199,12 +8215,46 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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 RP", 0, 0, + { 8608,-2097,-1178,-5425,13265,2383,-1149,2238,5680 } }, // From LibRaw + { "Canon EOS R3", 0, 0, + { 9423,-2839,-1195,-4532,12377,2415,-483,1374,5276 } }, // From LibRaw + { "Canon EOS R50", 0, 0, + { 9269, -2012, -1107, -3990, 11762, 2527, -569, 2093, 4913 } }, // From LibRaw + { "Canon EOS R100", 0, 0, + { 8230, -1515, -1032, -4179, 12005, 2454, -649, 2076, 4711 } }, // From LibRaw + { "Canon EOS R5", 0, 0, + { 9766,-2953,-1254,-4276,12116,2433,-437,1336,5131 } }, // From LibRaw + { "Canon EOS R6 Mark II", 0, 0, + { 9539, -2795, -1224, -4175, 11998, 2458, -465, 1755,6048 } }, // From LibRaw + { "Canon EOS R6", 0, 0, + { 8293,-1611,-1132,-4759,12711,2275,-1013,2415,5509 } }, // From LibRaw + { "Canon EOS R7", 0, 0, + { 10424, -3138, -1300, -4221, 11938, 2584, -547, 1658, 6183 } }, // From LibRaw + { "Canon EOS R8", 0, 0, + { 9539, -2795, -1224, -4175, 11998, 2458, -465, 1755, 6048 } }, // From LibRaw + { "Canon EOS R10", 0, 0, + { 9269, -2012, -1107, -3990, 11762, 2527, -569, 2093, 4913 } }, // From LibRaw + { "Canon EOS Ra", 0, 0, + { 22880,-11531,-2223,-2034,10469,1809, 316,1401,5769 } }, // From LibRaw + { "Canon EOS R", 0, 0, + { 8293,-1789,-1094,-5025,12925,2327,-1199,2769,6108 } }, // v.2 // From LibRaw + { "Canon EOS M6 Mark II", 0, 0, + { 11498,-3759,-1516,-5073,12954,2349,-892,1867,6118 } }, // From LibRaw { "Canon EOS M6", 0, 0, { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { "Canon EOS M50 Mark II", 0, 0, + { 10463,-2173,-1437,-4856,12635,2482,-1216,2915,7237 } }, // From LibRaw + { "Canon EOS M50", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, // From LibRaw { "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 M200", 0, 0, + { 10463,-2173,-1437,-4856,12635,2482,-1216,2915,7237 } }, // From LibRaw + { "Canon EOS M2", 0, 0, + { 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 } }, // From LibRaw { "Canon EOS M100", 0, 0, { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS M10", 0, 0, @@ -8227,6 +8277,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 4374,3631,-1743,-7520,15212,2472,-2892,3632,8161 } }, { "Canon EOS-1D C", 0, 0x3c4e, { 6847,-614,-1014,-4669,12737,2139,-1197,2488,6846 } }, + { "Canon EOS-1D X Mark III", 0, 0, + { 8971, -2022, -1242, -5405, 13249, 2380, -1280, 2483, 6072}}, // From LibRaw { "Canon EOS-1D X Mark II", 0, 0, { 7596,-978,-967,-4808,12571,2503,-1398,2567,5752 } }, { "Canon EOS-1D X", 0, 0x3c4e, @@ -8235,12 +8287,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6806,-179,-1020,-8097,16415,1687,-3267,4236,7690 } }, { "Canon EOS C500", 853, 0, /* DJC */ { 17851,-10604,922,-7425,16662,763,-3660,3636,22278 } }, + { "Canon PowerShot 600", 0, 0, + { -3822,10019,1311,4085,-157,3386,-5341,10829,4812,-1969,10969,1126 } }, // From LibRaw { "Canon PowerShot A530", 0, 0, { 0 } }, /* don't want the A5 matrix */ { "Canon PowerShot A50", 0, 0, { -5300,9846,1776,3436,684,3939,-5540,9879,6200,-1404,11175,217 } }, { "Canon PowerShot A5", 0, 0, { -4801,9475,1952,2926,1611,4094,-5259,10164,5947,-1554,10883,547 } }, + { "Canon PowerShot D10", 127, 0, + { 14052,-5229,-1156,-1325,9420,2252,-498,1957,4116 } }, /* DJC */ // From LibRaw { "Canon PowerShot G10", 0, 0, { 11093,-3906,-1028,-5047,12492,2879,-1003,1750,5561 } }, { "Canon PowerShot G11", 0, 0, @@ -8253,6 +8309,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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 Mark II", 0, 0, + { 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 } }, // From LibRaw { "Canon PowerShot G1 X", 0, 0, { 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 } }, { "Canon PowerShot G1", 0, 0, @@ -8263,12 +8321,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 } }, { "Canon PowerShot G3", 0, 0, { 9212,-2781,-1073,-6573,14189,2605,-2300,2844,7664 } }, + { "Canon PowerShot G5 X Mark II",0, 0, + { 11629, -5713, -914, -2706, 11090, 1842, -206, 1225, 5515 } }, // From LibRaw { "Canon PowerShot G5 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G5", 0, 0, { 9757,-2872,-933,-5972,13861,2301,-1622,2328,7212 } }, { "Canon PowerShot G6", 0, 0, { 9877,-3775,-871,-7613,14807,3072,-1448,1305,7485 } }, + { "Canon PowerShot G7 X Mark III", 0, 0, + { 11629, -5713, -914, -2706, 11090, 1842, -206, 1225, 5515 } }, // From LibRaw + { "Canon PowerShot G7 X Mark II", 0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, // From LibRaw { "Canon PowerShot G7 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G9 X Mark II", 0, 0, @@ -8305,14 +8369,24 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8039,-2643,-654,-3783,11230,2930,-206,690,4194 } }, { "Canon PowerShot S120", 0, 0, { 6961,-1685,-695,-4625,12945,1836,-1114,2152,5518 } }, + { "Canon PowerShot SD300", 0, 0, + { 6526,-1720,-1075,-1390,5945,602,-90,820,2380 } }, // CHDK // From LibRaw { "Canon PowerShot SX1 IS", 0, 0, { 6578,-259,-502,-5974,13030,3309,-308,1058,4970 } }, + { "Canon PowerShot SX20 IS", 0, 0, + { 8275,-2904,-1260,-128,5305,505,51,481,2450 } }, // CHDK // From LibRaw + { "Canon PowerShot SX30 IS", 0, 0, + { 13014,-4698,-1026,-2001,9615,2386,-164,1423,3759 } }, // CHDK // From LibRaw { "Canon PowerShot SX50 HS", 0, 0, { 12432,-4753,-1247,-2110,10691,1629,-412,1623,4926 } }, { "Canon PowerShot SX60 HS", 0, 0, { 13161,-5451,-1344,-1989,10654,1531,-47,1271,4955 } }, + { "Canon PowerShot SX70 HS", 0, 0, + { 18285,-8907,-1951,-1845,10688,1323,364,1101,5139 } }, // From LibRaw { "Canon PowerShot A3300", 0, 0, /* DJC */ { 10826,-3654,-1023,-3215,11310,1906,0,999,4960 } }, + { "Canon PowerShot A460", 0, 0, + { 6493,-2338,-885,-1589,5934,697,-445,1368,2543 } }, // CHDK // From LibRaw { "Canon PowerShot A470", 0, 0, /* DJC */ { 12513,-4407,-1242,-2680,10276,2405,-878,2215,4734 } }, { "Canon PowerShot A610", 0, 0, /* DJC */ @@ -8327,14 +8401,24 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9427,-3036,-959,-2581,10671,1911,-1039,1982,4430 } }, { "Canon PowerShot A720", 0, 0, /* DJC */ { 14573,-5482,-1546,-1266,9799,1468,-1040,1912,3810 } }, + { "Canon PowerShot S2 IS", 0, 0, + { 5477,-1435,-992,-1868,6639,510,-58,792,2670 } }, // CHDK // From LibRaw { "Canon PowerShot S3 IS", 0, 0, /* DJC */ { 14062,-5199,-1446,-4712,12470,2243,-1286,2028,4836 } }, { "Canon PowerShot SX110 IS", 0, 0, /* DJC */ { 14134,-5576,-1527,-1991,10719,1273,-1158,1929,3581 } }, + { "Canon PowerShot SX120 IS", 0, 0, + { 7286,-2242,-1047,41,4401,457,269,684,1864 } }, // CHDK // From LibRaw { "Canon PowerShot SX220", 0, 0, /* DJC */ { 13898,-5076,-1447,-1405,10109,1297,-244,1860,3687 } }, + { "Canon PowerShot SX710 HS", 0, 0, + { 13161,-5451,-1344,-1989,10654,1531,-47,1271,4955 } }, // From LibRaw { "Canon IXUS 160", 0, 0, /* DJC */ { 11657,-3781,-1136,-3544,11262,2283,-160,1219,4700 } }, + { "Casio EX-F1", 0, 0, + { 9084,-2016,-848,-6711,14351,2570,-1059,1725,6135 } }, // From LibRaw + { "Casio EX-FH100", 0, 0, + { 12771,-4179,-1558,-2149,10938,1375,-453,1751,4494 } }, // From LibRaw { "Casio EX-S20", 0, 0, /* DJC */ { 11634,-3924,-1128,-4968,12954,2015,-1588,2648,7206 } }, { "Casio EX-Z750", 0, 0, /* DJC */ @@ -8353,6 +8437,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Epson R-D1", 0, 0, { 6827,-1878,-732,-8429,16012,2564,-704,592,7145 } }, + { "Fujifilm DBP for GX680", 128, 0x0fff, + { 12741,-4916,-1420,-8510,16791,1715,-1767,2302,7771 } }, /* temp, copy from S2Pro */ // From LibRaw { "Fujifilm E550", 0, 0, { 11044,-3888,-1120,-7248,15168,2208,-1531,2277,8069 } }, { "Fujifilm E900", 0, 0, @@ -8365,9 +8451,15 @@ void CLASS adobe_coeff (const char *make, const char *model) { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, { "Fujifilm F7", 0, 0, { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, + { "Fujifilm F810", 0, 0, + { 11044,-3888,-1120,-7248,15167,2208,-1531,2276,8069 } }, // From LibRaw { "Fujifilm F8", 0, 0, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, - { "Fujifilm GFX 50S", 0, 0, + { "Fujifilm GFX 100 II", 0, 0, + { 12806,-5779,-1110,-3546,11507,2318,-177,996,5715 } }, // From LibRaw + { "Fujifilm GFX 100", 0, 0, // same CMs: "GFX 100", "GFX 100S"/"GFX100S", "GFX 100 IR" + { 16212,-8423,-1583,-4336,12583,1937,-195,726,6199 } }, // From LibRaw + { "Fujifilm GFX 50", 0, 0, // same CMs: "GFX 50S", "GFX 50R", "GFX 50S II" { 11756,-4754,-874,-3056,11045,2305,-381,1457,6006 } }, { "Fujifilm S100FS", 514, 0, { 11521,-4355,-1065,-6524,13767,3058,-1466,1984,6045 } }, @@ -8411,7 +8503,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { 21461,-10807,-1441,-2332,10599,1999,289,875,7703 } }, { "Fujifilm IS Pro", 0, 0, { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, - { "Fujifilm HS10 HS11", 0, 0xf68, + { "Fujifilm HS10", 0, 0xf68, { 12440,-3954,-1183,-1123,9674,1708,-83,1614,4086 } }, { "Fujifilm HS2", 0, 0xfef, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, @@ -8427,6 +8519,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 } }, { "Fujifilm X100T", 0, 0, { 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 } }, + { "Fujifilm X100V", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, // From LibRaw { "Fujifilm X100", 0, 0, { 12161,-4457,-1069,-5034,12874,2400,-795,1724,6904 } }, { "Fujifilm X10", 0, 0, @@ -8441,6 +8535,8 @@ 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-Pro3", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, // From LibRaw { "Fujifilm X-A10", 0, 0, { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 } }, { "Fujifilm X-A20", 0, 0, @@ -8453,6 +8549,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-A7", 0, 0, + { 15055,-7391,-1274,-4062,12071,2238,-610,1217,6147 } }, // From LibRaw { "Fujifilm X-E1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-E2S", 0, 0, @@ -8461,22 +8559,123 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-E4", 0, 0, + { 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 } }, // From LibRaw { "Fujifilm X-H1", 0, 0, { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-H2S", 0, 0, + { 12836, -5909, -1032, -3087, 11132, 2236, -35, 872, 5330 } }, // From LibRaw + { "Fujifilm X-H2", 0, 0, + { 11809, -5358, -1141, -4248, 12164, 2343, -514, 1097, 5848 } }, // From LibRaw { "Fujifilm X-M1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, + { "Fujifilm X-S20", 0, 0, + { 12836, -5909, -1032, -3087, 11132, 2236, -35, 872, 5330 } }, // From LibRaw + { "Fujifilm X-S10", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 } }, // From LibRaw { "Fujifilm X-S1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, + { "Fujifilm X-T100", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, // From LibRaw { "Fujifilm X-T1", 0, 0, /* also X-T10 */ { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { "Fujifilm X-T200", 0, 0, + { 15055,-7391,-1274,-4062,12071,2238,-610,1217,6147 } }, // From LibRaw { "Fujifilm X-T2", 0, 0, /* also X-T20 */ { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-T3", 0, 0, // same CMs: X-T3, X-T30, "X-T30 II" + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, // v.2 // From LibRaw + { "Fujifilm X-T4", 0, 0, + { 13426,-6334,-1177,-4244,12136,2371,580,1303,5980 } }, // From LibRaw + { "Fujifilm X-T5", 0, 0, + { 11809, -5358, -1141, -4248, 12164, 2343, -514, 1097, 5848 } }, // From LibRaw + { "Fujifilm XF10", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, // From LibRaw { "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 } }, + { "GITUP G3DUO", 130, 62000, + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, // From LibRaw + { "GITUP GIT2P", 4160, 0, + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, // From LibRaw + { "GITUP GIT2", 3200, 0, + { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, // From LibRaw { "GoPro HERO5 Black", 0, 0, { 10344,-4210,-620,-2315,10625,1948,93,1058,5541 } }, + { "Hasselblad L1D-20c", 0, 0, + { 7310, -2746, -646, -2991, 10847, 2469, 163, 585, 6324}}, // From LibRaw +// TODO: These Hasselblad camera names are from LibRaw. dcraw names are different. +// { "Hasselblad 16-Uncoated-3FR", 0, 0, +// { 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809}}, +// { "Hasselblad 16-Uncoated-FFF", 0, 0, +// { 8068, -2959, -108, -5788, 13608, 2389, -1002, 2237, 8162}}, +// { "Hasselblad 16-Uncoated", 0, 0, +// { 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809}}, +// { "Hasselblad 22-Uncoated-3FR", 0, 0, +// { 8523, -3257, -280, -5078, 13458, 1743, -1449, 2961, 7809}}, +// { "Hasselblad 22-Uncoated-FFF", 0, 0, +// { 8068, -2959, -108, -5788, 13608, 2389, -1002, 2237, 8162}}, +// { "Hasselblad 22-Uncoated", 0, 0, +// { 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809}}, +// { "Hasselblad 31-Uncoated-FFF", 0, 0, +// { 5155, -1201, 200, -5841, 13197, 2950, -1101, 2317, 6988}}, +// { "Hasselblad 31-Uncoated", 0, 0, +// { 5458, -1448, 145, -4479, 12338, 2401, -1659, 3086, 6710}}, +// { "Hasselblad 39-Uncoated-3FR", 0, 0, +// { 3904, -100, 262, -4318, 12407, 2128, -1598, 3594, 6233}}, +// { "Hasselblad 39-Uncoated-FFF", 0, 0, +// { 4739, -932, 295, -4829, 12220, 2952, -1027, 2341, 7083}}, +// { "Hasselblad 39-Uncoated", 0, 0, +// { 3894, -110, 287, -4672, 12610, 2295, -2092, 4100, 6196}}, +// { "Hasselblad 39-Coated-3FR", 0, 0, +// { 5427, -1147, 173, -3834, 12073, 1969, -1444, 3320, 5621}}, +// { "Hasselblad 39-Coated-FFF", 0, 0, +// { 5323, -1233, 399, -4926, 12362, 2894, -856, 2471, 5961}}, +// { "Hasselblad 39-Coated", 0, 0, +// { 3857, 452, -46, -6008, 14477, 1596, -2627, 4481, 5718}}, +// { "Hasselblad 40-Coated5-3FR", 0, 0, +// { 7014, -2067, -540, -4821, 13016, 1980, -1663, 3089, 6940}}, +// { "Hasselblad 40-Coated5-FFF", 0, 0, +// { 5963, -1357, -172, -5439, 12762, 3007, -964, 2222, 7172}}, +// { "Hasselblad 40-Coated5", 0, 0, +// { 6159, -1402, -177, -5439, 12762, 3007, -955, 2200, 7104}}, +// { "Hasselblad 40-Coated-3FR", 0, 0, +// { 6550, -1681, -399, -4626, 12598, 2257, -1807, 3354, 6486}}, +// { "Hasselblad 40-Coated-FFF", 0, 0, +// { 6041, -1375, -174, -5439, 10000, 3007, -930, 2145, 6923}}, +// { "Hasselblad 40-Coated", 0, 0, +// { 6159, -1402, -177, -5439, 12762, 3007, -955, 2200, 7104}}, +// { "Hasselblad 50-Coated5-3FR", 0, 0, +// { 5707, -693, -382, -4285, 12669, 1773, -1615, 3519, 5410}}, +// { "Hasselblad 50-Coated5-FFF", 0, 0, +// { 5263, -612, 39, -4950, 12426, 2843, -935, 2423, 5941}}, +// { "Hasselblad 50-Coated5", 0, 0, +// { 5656, -659, -346, -3923, 12306, 1791, -1602, 3509, 5442}}, +// { "Hasselblad 50-Coated-3FR", 0, 0, +// { 5656, -659, -346, -3923, 12305, 1790, -1602, 3509, 5442}}, +// { "Hasselblad 50-Coated-FFF", 0, 0, +// { 5280, -614, 39, -4950, 12426, 2843, -939, 2434, 5968}}, +// { "Hasselblad 50-Coated", 0, 0, +// { 5656, -659, -346, -3923, 12306, 1791, -1602, 3509, 5442}}, +// { "Hasselblad 50-15-Coated5-II-3FR", 0, 0, +// { 10887, -6152, 1034, -3564, 12412, 4224, 63, 626, 10123}}, +// { "Hasselblad 50-15-Coated5-II-FFF", 0, 0, +// { 4932, -835, 141, -4878, 11868, 3437, -1138, 1961, 7067}}, +// { "Hasselblad 50-15-Coated5-II", 0, 0, +// { 8737, -4937, 830, -2860, 9961, 3390, 51, 502, 8124}}, +// { "Hasselblad 50-15-Coated5", 0, 0, +// { 4932,-835,141,-4878,11868,3437,-1138,1961,7067 } }, +// { "Hasselblad 60-Coated-3FR", 0, 0, +// { 9296, 336, -1088, -6442, 14323, 2289, -1433, 2942, 5756}}, +// { "Hasselblad 60-Coated", 0, 0, +// { 9662, -684, -279, -4903, 12293, 2950, -344, 1669, 6024}}, +// { "Hasselblad 100-17-Coated5", 0, 0, +// { 5110, -1357, -308, -5573, 12835, 3077, -1279, 2025, 7010}}, +// { "Hasselblad 100-20-Coated6", 0, 0, +// { 6468,-1899,-545,-4526,12267,2542,-388,1276,6096 } }, + { "HTC One A9", 64, 1023, + { 101,-20,-2,-11,145,41,-24,1,56 } }, /* this is FM1 transposed */ // From LibRaw { "Imacon Ixpress", 0, 0, /* DJC */ { 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } }, { "Kodak NC2000", 0, 0, @@ -8487,11 +8686,11 @@ void CLASS adobe_coeff (const char *make, const char *model) { 20620,-7572,-2801,-103,10073,-396,3551,-233,2220 } }, { "Kodak DCS420", 0, 0, { 10868,-1852,-644,-1537,11083,484,2343,628,2216 } }, - { "Kodak DCS460", 0, 0, + { "Kodak DCS46", 0, 0, // same CM as EOSDCS1 and DCS465 DB { 10592,-2206,-967,-1944,11685,230,2206,670,1273 } }, { "Kodak EOSDCS1", 0, 0, { 10592,-2206,-967,-1944,11685,230,2206,670,1273 } }, - { "Kodak EOSDCS3B", 0, 0, + { "Kodak EOSDCS3", 0, 0, { 9898,-2700,-940,-2478,12219,206,1985,634,1031 } }, { "Kodak DCS520C", 178, 0, { 24542,-10860,-3401,-1490,11370,-297,2858,-605,3225 } }, @@ -8517,6 +8716,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 16414,-6060,-1470,-3555,13037,473,2545,122,4948 } }, { "Kodak ProBack", 0, 0, { 21179,-8316,-2918,-915,11019,-165,3477,-180,4210 } }, + { "Kodak PIXPRO AZ901", 0, 0, // dng + { 21875, -8006, -2558, 634, 8194, 1104, 1535, 951, 6969}}, // From LibRaw { "Kodak P712", 0, 0, { 9658,-3314,-823,-5163,12695,2768,-1342,1843,6044 } }, { "Kodak P850", 0, 0xf7c, @@ -8531,16 +8732,62 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11749,-4048,-1309,-1867,10572,1489,-138,1449,4522 } }, { "Kodak EASYSHARE Z1015", 0, 0xef1, { 11265,-4286,-992,-4694,12343,2647,-1090,1523,5447 } }, + { "Leaf AFi 54S", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw + { "Leaf AFi 65S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, // From LibRaw + { "Leaf AFi 75S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, // From LibRaw { "Leaf CMost", 0, 0, { 3952,2189,449,-6701,14585,2275,-4536,7349,6536 } }, + { "Leaf Credo 40", 0, 0, + { 8035, 435, -962, -6001, 13872, 2320, -1159, 3065, 5434}}, // From LibRaw + { "Leaf Credo 50", 0, 0, // emb + { 10325, 845, -604, -4113, 13385, 481, -1791, 4163, 6924}}, // From LibRaw + { "Leaf Credo 60", 0, 0, + { 8035, 435, -962, -6001, 13872, 2320, -1159, 3065, 5434}}, // From LibRaw + { "Leaf Credo 80", 0, 0, + { 6294, 686, -712, -5435, 13417, 2211, -1006, 2435, 5042}}, // From LibRaw + { "Leaf Valeo 11", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw + { "Leaf Valeo 17", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw + { "Leaf Valeo 22", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw { "Leaf Valeo 6", 0, 0, { 3952,2189,449,-6701,14585,2275,-4536,7349,6536 } }, + { "Leaf AFi-II 7", 0, 0, + { 7691,-108,-339,-6185,13627,2833,-2046,3899,5952 } }, // From LibRaw + { "Leaf AFi-II 10", 0, 0, + { 6719,1147,-148,-6929,14061,3176,-1781,3343,5424 } }, // From LibRaw + { "Leaf Aptus 17", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw + { "Leaf Aptus 22", 0, 0, + { 8236, 1746, -1313, -8251, 15953, 2428, -3672, 5786, 5771}}, // From LibRaw { "Leaf Aptus 54S", 0, 0, { 8236,1746,-1314,-8251,15953,2428,-3673,5786,5771 } }, + { "Leaf Aptus 65S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, // From LibRaw { "Leaf Aptus 65", 0, 0, { 7914,1414,-1190,-8777,16582,2280,-2811,4605,5562 } }, + { "Leaf Aptus 75S", 0, 0, + { 7914, 1414, -1190, -8776, 16582, 2280, -2811, 4605, 5562}}, // From LibRaw { "Leaf Aptus 75", 0, 0, { 7914,1414,-1190,-8777,16582,2280,-2811,4605,5562 } }, + { "Leaf Aptus-II 5", 0, 0, + { 7914,1414,-1190,-8777,16582,2280,-2811,4605,5562 } }, // From LibRaw + { "Leaf Aptus-II 6", 0, 0, + { 7989,-113,-352,-6185,13627,2833,-2028,3866,5901 } }, // From LibRaw + { "Leaf Aptus-II 7", 0, 0, + { 8209,-116,-362,-6185,13627,2833,-1962,3740,5709 } }, // From LibRaw + { "Leaf Aptus-II 8", 0, 0, + { 7361,1257,-163,-6929,14061,3176,-1839,3454,5603 } }, // From LibRaw + { "Leaf Aptus-II 10R", 0, 0, + { 7167,1224,-158,-6929,14061,3176,-1826,3429,5562 } }, // From LibRaw + { "Leaf Aptus-II 10", 0, 0, + { 7527,1285,-166,-6929,14061,3176,-1995,3747,6077 } }, // From LibRaw + { "Leaf Aptus-II 12", 0, 0, + { 7361,1257,-163,-6929,14061,3176,-1695,3182,5162 } }, // From LibRaw { "Leaf", 0, 0, { 8236,1746,-1314,-8251,15953,2428,-3673,5786,5771 } }, { "Mamiya ZD", 0, 0, @@ -8551,6 +8798,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8983,-2942,-963,-6556,14476,2237,-2426,2887,8014 } }, { "Minolta DiMAGE 7Hi", 0, 0xf7d, { 11368,-3894,-1242,-6521,14358,2339,-2475,3056,7285 } }, + { "Minolta DiMAGE 7i", 0, 0xf7d, + { 11050,-3791,-1199,-7875,15585,2434,-2797,3359,7560 } }, // From LibRaw { "Minolta DiMAGE 7", 0, 0xf7d, { 9144,-2777,-998,-6676,14556,2281,-2470,3019,7744 } }, { "Minolta DiMAGE A1", 0, 0xf8b, @@ -8591,6 +8840,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D3400", 0, 0, { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, + { "Nikon D3500", 0, 0, + { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, // From LibRaw { "Nikon D300", 0, 0, { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } }, { "Nikon D3X", 0, 0, @@ -8633,6 +8884,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8178,-2245,-609,-4857,12394,2776,-1207,2086,7298 } }, { "Nikon D60", 0, 0, { 8736,-2458,-935,-9075,16894,2251,-1354,1242,8263 } }, + { "Nikon D6", 0, 0, + { 9028,-3423,-1035,-6321,14265,2217,-1013,1683,6928 } }, // From LibRaw { "Nikon D7000", 0, 0, { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, { "Nikon D7100", 0, 0, @@ -8641,6 +8894,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, { "Nikon D7500", 0, 0, { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, + { "Nikon D780", 0, 0, + { 9943,-3269,-839,-5323,13269,2259,-1198,2083,7557 } }, // From LibRaw { "Nikon D750", 0, 0, { 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 } }, { "Nikon D700", 0, 0, @@ -8649,6 +8904,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, { "Nikon D850", 0, 0, { 10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785 } }, + { "Nikon D810A", 0, 0, + { 11973,-5685,-888,-1965,10326,1901,-115,1123,7169 } }, // From LibRaw { "Nikon D810", 0, 0, { 9369,-3195,-791,-4488,12430,2301,-893,1796,6872 } }, { "Nikon D800", 0, 0, @@ -8687,6 +8944,24 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8489,-2583,-1036,-8051,15583,2643,-1307,1407,7354 } }, { "Nikon E8800", 0, 0, { 7971,-2314,-913,-8451,15762,2894,-1442,1520,7610 } }, + { "Nikon Z 30", 0, 0, + { 10339,-3822,-890,-4183,12023,2436,-671,1638,7049 } }, // From LibRaw + { "Nikon Z 50", 0, 0, + { 11640,-4829,-1079,-5107,13006,2325,-972,1711,7380 } }, // From LibRaw + { "Nikon Z 5", 0, 0, + { 8695,-2558,-648,-5015,12711,2575,-1279,2215,7514 } }, // From LibRaw + { "Nikon Z 6", 0, 0, + { 9943,-3269,-839,-5323,13269,2259,-1198,2083,7557 } }, // 'Z 6'(v.2) // From LibRaw, 'Z 6_2' + { "Nikon Z 7", 0, 0, + { 13705,-6004,-1400,-5464,13568,2062,-940,1706,7618 } }, // 'Z 7'(v.2), 'Z 7_2' // From LibRaw + { "Nikon Z 8", 0, 0, + {11423,-4564,-1123,-4816,12895,2119,-210,1061,7282 } }, // From LibRaw + { "Nikon Z 9", 0, 0, + { 13389,-6049,-1441,-4544,12757,1969,229,498,7390 } }, // From LibRaw + { "Nikon Z fc", 0, 0, + { 11640,-4829,-1079,-5107,13006,2325,-972,1711,7380 } }, // From LibRaw + { "Nikon COOLPIX A1000", 0, 0, + { 10601,-3487,-1127,-2931,11443,1676,-587,1740,5278 } }, // From LibRaw { "Nikon COOLPIX A", 0, 0, { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, { "Nikon COOLPIX B700", 200, 0, @@ -8695,6 +8970,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, { "Nikon COOLPIX P340", 200, 0, { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, + { "Nikon Coolpix P950", 0, 0, + { 13307, -5641, -1290, -2048, 10581, 1689, -64, 1222, 5176}}, // From LibRaw + { "Nikon COOLPIX P1000", 0, 0, + { 14294,-6116,-1333,-1628,10219,1637,-14,1158,5022 } }, // From LibRaw { "Nikon COOLPIX P6000", 0, 0, { 9698,-3367,-914,-4706,12584,2368,-837,968,5801 } }, { "Nikon COOLPIX P7000", 0, 0, @@ -8775,6 +9054,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, { "Olympus E-P5", 0, 0, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus E-P7", 0, 0, + { 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } }, // From LibRaw + { "Olympus E-PL10", 0, 0, + { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, // From LibRaw { "Olympus E-PL1s", 0, 0, { 11409,-3872,-1393,-4572,12757,2003,-709,1810,7415 } }, { "Olympus E-PL1", 0, 0, @@ -8797,12 +9080,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-M10MarkIV", 0, 0, + { 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } }, // From LibRaw { "Olympus E-M10", 0, 0, /* also E-M10 Mark II & III */ { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus E-M1X", 0, 0, + { 11896,-5110,-1076,-3181,11378,2048,-519,1224,5166 } }, // From LibRaw + { "Olympus E-M1MarkIII", 0, 0, + { 11896,-5110,-1076,-3181,11378,2048,-519,1224,5166 } }, // From LibRaw { "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-M5MarkIII", 0, 0, + { 11896,-5110,-1076,-3181,11378,2048,-519,1224,5166 } }, // From LibRaw { "Olympus E-M5MarkII", 0, 0, { 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 } }, { "Olympus E-M5", 0, 0xfe1, @@ -8824,13 +9115,15 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11597,-4006,-1049,-5432,12799,2957,-1029,1750,6516 } }, { "Olympus SP560UZ", 0, 0xff9, { 10915,-3677,-982,-5587,12986,2911,-1168,1968,6223 } }, + { "Olympus SP565UZ", 0, 0, + { 11856,-4469,-1159,-4814,12368,2756,-993,1779,5589 } }, // From LibRaw { "Olympus SP570UZ", 0, 0, { 11522,-4044,-1146,-4736,12172,2904,-988,1829,6039 } }, { "Olympus STYLUS1", 0, 0, { 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, + { "Olympus TG-", 0, 0, // same CMs: TG-5, TG-6 { 10899,-3833,-1082,-2112,10736,1575,-267,1452,5269 } }, { "Olympus XZ-10", 0, 0, { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, @@ -8840,6 +9133,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, { "OM Digital Solutions OM-1", 0, 0, { 9488, -3984, -714, -2887, 10945, 2229, -137, 960, 5786 } }, // From LibRaw + { "OM Digital Solutions OM-5", 0, 0, + { 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5166 } }, // From LibRaw { "OmniVision", 0, 0, /* DJC */ { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, { "Pentax *ist DL2", 0, 0, @@ -8852,6 +9147,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10371,-2333,-1206,-8688,16231,2602,-1230,1116,11282 } }, { "Pentax *ist D", 0, 0, { 9651,-2059,-1189,-8881,16512,2487,-1460,1345,10687 } }, + { "Pentax K-01", 0, 0, + { 8134,-2728,-645,-4365,11987,2694,-838,1509,6498 } }, // From LibRaw { "Pentax K10D", 0, 0, { 9566,-2863,-803,-7170,15172,2112,-818,803,9705 } }, { "Pentax K1", 0, 0, @@ -8872,10 +9169,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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 Mark III", 0, 0, + { 9251, -3817, -1069, -4627, 12667, 2175, -798, 1660, 5633 } }, // From LibRaw { "Pentax K-3 II", 0, 0, { 8626,-2607,-1155,-3995,12301,1881,-1039,1822,6925 } }, { "Pentax K-3", 0, 0, { 7415,-2052,-721,-5186,12788,2682,-1446,2157,6773 } }, + { "Pentax K-500", 0, 0, + { 8109,-2740,-608,-4593,12175,2731,-1006,1515,6545 } }, // From LibRaw + { "Pentax K-50", 0, 0, + { 8109,-2740,-608,-4593,12175,2731,-1006,1515,6545 } }, // From LibRaw { "Pentax K-5 II", 0, 0, { 8170,-2725,-639,-4440,12017,2744,-771,1465,6599 } }, { "Pentax K-5", 0, 0, @@ -8892,8 +9195,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8617,-3228,-1034,-4674,12821,2044,-803,1577,5728 } }, { "Pentax Q-S1", 0, 0, { 12995,-5593,-1107,-1879,10139,2027,-64,1233,4919 } }, + { "Pentax Q7", 0, 0, + { 10901,-3938,-1025,-2743,11210,1738,-823,1805,5344 } }, // From LibRaw + { "Pentax Q10", 0, 0, + { 11562,-4183,-1172,-2357,10919,1641,-582,1726,5112 } }, // From LibRaw + { "Pentax Q", 0, 0, + { 11731,-4169,-1267,-2015,10727,1473,-217,1492,4870 } }, // From LibRaw + { "Pentax MX-1", 0, 0, + { 9296,-3146,-888,-2860,11287,1783,-618,1698,5151 } }, // From LibRaw { "Pentax 645D", 0, 0x3e00, { 10646,-3593,-1158,-3329,11699,1831,-667,2874,6287 } }, + { "Pentax 645Z", 0, 0, + { 9519,-3591,-664,-4074,11725,2671,-624,1501,6653 } }, // From LibRaw { "Panasonic DMC-CM1", 15, 0, { 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 } }, { "Panasonic DC-FZ80", 0, 0, @@ -8932,6 +9245,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11340,-4069,-1275,-7555,15266,2448,-2960,3426,7685 } }, { "Leica DIGILUX 2", 0, 0, { 11340,-4069,-1275,-7555,15266,2448,-2960,3426,7685 } }, + { "Panasonic DC-LX100M2", 15, 0, + { 8585,-3127,-833,-4005,12250,1953,-650,1494,4862 } }, // v.2 // From LibRaw { "Panasonic DMC-LX100", 15, 0, { 8844,-3538,-768,-3709,11762,2200,-698,1792,5220 } }, { "Leica D-LUX (Typ 109)", 15, 0, @@ -8962,6 +9277,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } }, { "Panasonic DMC-LX9", 15, 0, { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, + { "Panasonic DC-FZ10002", 15, 0, + { 9803,-4185,-992,-4066,12578,1628,-838,1824,5288 } }, // From LibRaw { "Panasonic DMC-FZ1000", 15, 0, { 7830,-2696,-763,-3325,11667,1866,-641,1712,4824 } }, { "Leica V-LUX (Typ 114)", 15, 0, @@ -8996,12 +9313,26 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-S1R", 0, 0, + { 11822,-5321,-1249,-5958,15114,766,-614,1264,7043 } }, // From LibRaw + { "Panasonic DC-S1H", 0, 0, + { 9397,-3719,-805,-5425,13326,2309,-972,1715,6034 } }, // From LibRaw + { "Panasonic DC-S1", 0, 0, + { 9744,-3905,-779,-4899,12807,2324,-798,1630,5827 } }, // From LibRaw { "Panasonic DC-S5M2", 0, 0, /* DC-S5M2, DC-S5M2X */ { 10308,-4206,-783,-4088,12102,2229,-125,1051,5912 } }, + { "Panasonic DC-S5", 0, 0, + { 9744,-3905,-779,-4899,12807,2324,-798,1630,5827 } }, // From LibRaw + { "Panasonic DC-G99", 15, 0, + { 9657,-3963,-748,-3361,11378,2258,-568,1415,5158 } }, // From LibRaw + { "Panasonic DC-G100", 15, 0, + { 8370,-2869,-710,-3389,11372,2298,-640,1599,4887 } }, // From LibRaw { "Panasonic DC-G9M2", 0, 0, { 8325,-3456,-623,-4330,12089,2528,-860,2646,5984 } }, { "Panasonic DC-G9", 15, 0xfff, { 7685,-2375,-634,-3687,11700,2249,-748,1546,5111 } }, + { "Panasonic DC-GF10", 15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, // From LibRaw { "Panasonic DMC-GF1", 15, 0xf92, { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } }, { "Panasonic DMC-GF2", 15, 0xfff, @@ -9062,28 +9393,74 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, { "Panasonic DMC-ZS70", 15, 0, { 9052,-3117,-883,-3045,11346,1927,-205,1520,4730 } }, + { "Panasonic DMC-ZS80", 15, 0, + { 12194,-5340,-1329,-3035,11394,1858,-50,1418,5219 } }, // From LibRaw { "Leica S (Typ 007)", 0, 0, { 6063,-2234,-231,-5210,13787,1500,-1043,2866,6997 } }, + { "Leica X2", 0, 0, + { 8336,-2853,-699,-4425,11989,2760,-954,1625,6396 } }, // From LibRaw + { "Leica X1", 0, 0, + { 9055,-2611,-666,-4906,12652,2519,-555,1384,7417 } }, // From LibRaw { "Leica X", 0, 0, /* X and X-U, both (Typ 113) */ { 7712,-2059,-653,-3882,11494,2726,-710,1332,5958 } }, { "Leica Q (Typ 116)", 0, 0, { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { "Leica Q2", 0, 0, + { 12312,-5440,-1307,-6408,15499,824,-1075,1677,7220 } }, // From LibRaw { "Leica M (Typ 262)", 0, 0, { 6653,-1486,-611,-4221,13303,929,-881,2416,7226 } }, + { "Leica M (Typ 2", 0, 0, // same CMs: "M (Typ 240)", "M-D (Typ 262)" + { 7199,-2140,-712,-4005,13327,649,-810,2521,6673 } }, // From LibRaw { "Leica SL (Typ 601)", 0, 0, { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { "Leica S2", 0, 0, + { 5627,-721,-447,-4423,12456,2192,-1048,2948,7379 } }, // From LibRaw + { "Leica S3", 0, 0, + { 5092,-1630,-470,-6313,14297,2170,-1603,3135,5982 } }, // From LibRaw + { "Leica S", 0, 0, // same CMs: "S-E (Typ 006)", "S (Typ 006)" + { 5749,-1072,-382,-4274,12432,2048,-1166,3104,7105 } }, // From LibRaw { "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 T", 0, 0, // same CMs: TL, "T (Typ 701)" + { 6295,-1679,-475,-5586,13046,2837,-1410,1889,7075 } }, // From LibRaw { "Leica CL", 0, 0, { 7414,-2393,-840,-5127,13180,2138,-1585,2468,5064 } }, + { "Leica M8", 0, 0, + { 7675,-2196,-305,-5860,14119,1856,-2425,4006,6578 } }, // From LibRaw + { "Leica M9", 0, 0, + { 6687,-1751,-291,-3556,11373,2492,-548,2204,7146 } }, // From LibRaw { "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, { 2905,732,-237,-8134,16626,1476,-3038,4253,7517 } }, + { "Phase One IQ140", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, // From LibRaw + { "Phase One IQ150", 0, 0, + {10325,845,-604,-4113,13385,481,-1791,4163,6924}}, /* temp */ /* emb // From LibRaw */ + { "Phase One IQ160", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, // From LibRaw + { "Phase One IQ180", 0, 0, + { 6294,686,-712,-5435,13417,2211,-1006,2435,5042 } }, // From LibRaw + { "Phase One IQ250",0, 0, + {10325,845,-604,-4113,13385,481,-1791,4163,6924}}, /* emb */ // From LibRaw + { "Phase One IQ260", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, // From LibRaw + { "Phase One IQ280", 0, 0, + { 6294,686,-712,-5435,13417,2211,-1006,2435,5042 } }, // From LibRaw + { "Phase One IQ3 100MP", 0, 0, + { 10999,354,-742,-4590,13342,937,-1060,2166,8120} }, /* emb */ // From LibRaw + { "Phase One IQ3 50MP", 0, 0, + {10058,1079,-587,-4135,12903,944,-916,2726,7480}}, /* emb */ // From LibRaw + { "Phase One IQ3 60MP", 0, 0, + { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, // From LibRaw + { "Phase One IQ3 80MP", 0, 0, + { 6294,686,-712,-5435,13417,2211,-1006,2435,5042 } }, // From LibRaw + { "Phase One P21", 0, 0, + { 6516,-2050,-507,-8217,16703,1479,-3492,4741,8489 } }, // From LibRaw { "Phase One P 2", 0, 0, { 2905,732,-237,-8134,16626,1476,-3038,4253,7517 } }, { "Phase One P 30", 0, 0, @@ -9096,20 +9473,60 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, { "Photron BC2-HD", 0, 0, /* DJC */ { 14603,-4122,-528,-1810,9794,2017,-297,2763,5936 } }, + { "Polaroid x530", 0, 0, + { 13458,-2556,-510,-5444,15081,205,0,0,12120 } }, // From LibRaw { "Red One", 704, 0xffff, /* DJC */ { 21014,-7891,-2613,-3056,12201,856,-2203,5125,8042 } }, + { "Ricoh S10 24-72mm F2.5-4.4 VC", 0, 0, + { 10531,-4043,-878,-2038,10270,2052,-107,895,4577 } }, // From LibRaw + { "Ricoh GR A12 50mm F2.5 MACRO", 0, 0, + { 8849,-2560,-689,-5092,12831,2520,-507,1280,7104 } }, // From LibRaw + { "Ricoh GR DIGITAL 2", 0, 0, + { 8846,-2704,-729,-5265,12708,2871,-1471,1955,6218 } }, // From LibRaw + { "Ricoh GR DIGITAL 3", 0, 0, + { 8170,-2496,-655,-5147,13056,2312,-1367,1859,5265 } }, // From LibRaw + { "Ricoh GR DIGITAL 4", 0, 0, + { 8771,-3151,-837,-3097,11015,2389,-703,1343,4924 } }, // From LibRaw + { "Ricoh GR III", 0, 0, + { 6127,-1777,-585,-5913,13699,2428,-1088,1780,6017 } }, // From LibRaw { "Ricoh GR II", 0, 0, { 4630,-834,-423,-4977,12805,2417,-638,1467,6115 } }, { "Ricoh GR", 0, 0, { 3708,-543,-160,-5381,12254,3556,-1471,1929,8234 } }, + { "Ricoh GX200", 0, 0, + { 8040,-2368,-626,-4659,12543,2363,-1125,1581,5660 } }, // From LibRaw + { "Ricoh GXR Mount A12", 0, 0, + { 7834,-2182,-739,-5453,13409,2241,-952,2005,6620 } }, // From LibRaw + { "Ricoh GXR A12 50mm", 0, 0, + { 8849,-2560,-689,-5092,12831,2520,-507,1280,7104 } }, // From LibRaw + { "Ricoh GXR A12 28mm", 0, 0, + { 10228,-3159,-933,-5304,13158,2371,-943,1873,6685 } }, // From LibRaw + { "Ricoh GXR A16", 0, 0, + { 7837,-2538,-730,-4370,12184,2461,-868,1648,5830 } }, // From LibRaw + { "Ricoh GXR P10", 0, 0, + { 13168,-5128,-1663,-3006,11569,1611,-373,1244,4907 } }, // From LibRaw + { "Ricoh GXR S10", 0, 0, + { 8963,-2926,-754,-4881,12921,2164,-1464,1944,4901 } }, // From LibRaw { "Samsung EX1", 0, 0x3e00, { 8898,-2498,-994,-3144,11328,2066,-760,1381,4576 } }, { "Samsung EX2F", 0, 0x7ff, { 10648,-3897,-1055,-2022,10573,1668,-492,1611,4742 } }, { "Samsung EK-GN120", 0, 0, { 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 } }, + { "Samsung Galaxy S6", 0, 0, // same CMs: "Galaxy S6", "Galaxy S6 Edge" + { 13699,-5767,-1384,-4449,13879,499,-467,1691,5892 } }, // From LibRaw + { "Samsung Galaxy S7", 0, 0, // same CMs: "Galaxy S7", "Galaxy S7 Edge" + { 9927,-3704,-1024,-3935,12758,1257,-389,1512,4993 } }, // From LibRaw + { "Samsung Galaxy S8", 0, 0, // same CMs: "Galaxy S8", "Galaxy S8+" + { 9927,-3704,-1024,-3935,12758,1257,-389,1512,4993 } }, // From LibRaw + { "Samsung Galaxy S9", 0, 0, // same CMs: "Galaxy S9", "Galaxy S9+" + { 13292,-6142,-1268,-4095,12890,1283,-557,1930,5163 } }, // From LibRaw + { "Samsung Galaxy Note 9 Rear Camera", 0, 0, + { 13292,-6142,-1268,-4095,12890,1283,-557,1930,5163 } }, // From LibRaw { "Samsung NX mini", 0, 0, { 5222,-1196,-550,-6540,14649,2009,-1666,2819,5657 } }, + { "Samsung NX U", 0, 0, + { 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 } }, // From LibRaw { "Samsung NX3300", 0, 0, { 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 } }, { "Samsung NX3000", 0, 0, @@ -9136,6 +9553,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 } }, { "Samsung WB2000", 0, 0xfff, { 12093,-3557,-1155,-1000,9534,1733,-22,1787,4576 } }, + { "Samsung WB5000", 0, 0, + { 7675, -2195, -305, -5860, 14118, 1857, -2425, 4007, 6578}}, // From LibRaw { "Samsung GX-1", 0, 0, { 10504,-2438,-1189,-8603,16207,2531,-1022,863,12242 } }, { "Samsung GX20", 0, 0, /* copied from Pentax K20D */ @@ -9150,6 +9569,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-HX9", 200, 0, // same CMs: DSC-HX95, DSC-HX99. RT: BL divided by 4 + { 13076,-5686,-1481,-4027,12851,1251,-167,725,4937 } }, // From LibRaw + { "Sony ZV-1", 200, 0, // same CMs: ZV-1, ZV-1B, ZV-1M2. RT: BL divided by 4 + { 8280,-2987,-703,-3531,11645,2133,-550,1542,5312 } }, // From LibRaw + { "Sony ZV-E10", 0, 0, + { 6355,-2067,-490,-3653,11542,2400,-406,1258,5506 } }, // From LibRaw + { "Sony ZV-E1", 0, 0, + { 6912,-2127,-469,-4470,12175,2587,-398,1478,6492 } }, // From LibRaw + { "Sony DSC-RX100M7", 0, 0, + {10315, -4390, -937, -4859, 12734, 2365, -734, 1537, 5997 } }, // From LibRaw + { "Sony DSC-RX100M6", 0, 0, + { 7325,-2321,-596,-3494,11674,2055,-668,1562,5031 } }, // From LibRaw + { "Sony DSC-RX100M5A", 0, 0, + { 11176,-4700,-965,-4004,12184,2032,-763,1726,5876 } }, // From LibRaw { "Sony DSC-RX100M", 0, 0, /* M2, M3, M4, and M5 */ { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Sony DSC-RX100", 0, 0, @@ -9160,6 +9593,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-RX1R", 0, 0, + { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, // From LibRaw { "Sony DSC-RX1", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, { "Sony DSC-RX0", 200, 0, @@ -9200,28 +9635,56 @@ void CLASS adobe_coeff (const char *make, const char *model) { 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 } }, { "Sony ILCA-99M2", 0, 0, { 6660,-1918,-471,-4613,12398,2485,-649,1433,6447 } }, + { "Sony ILCE-1", 0, 0, + { 8161, -2947, -739, -4811, 12668, 2389, -437, 1229, 6524}}, // From LibRaw + { "Sony ILCE-6100", 0, 0, + { 7657,-2847,-607,-4083,11966,2389,-684,1418,5844 } }, // From LibRaw + { "Sony ILCE-6300", 0, 0, + { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, + { "Sony ILCE-6400", 0, 0, + { 7657,-2847,-607,-4083,11966,2389,-684,1418,5844 } }, // From LibRaw + { "Sony ILCE-6500", 0, 0, + { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, + { "Sony ILCE-6600", 0, 0, + { 7657,-2847,-607,-4083,11966,2389,-684,1418,5844 } }, // From LibRaw { "Sony ILCE-6700", 0, 0, { 6972,-2408,-600,-4330,12101,2515,-388,1277,5847 } }, - { "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-7M4", 0, 0, + { 7460,-2365,-588,-5687,13442,2474,-624,1156,6584 } }, // From LibRaw + { "Sony ILCE-7SM3", 0, 0, + { 6912,-2127,-469,-4470,12175,2587,-398,1478,6492 } }, // From LibRaw { "Sony ILCE-7S", 0, 0, /* also ILCE-7SM2 */ { 5838,-1430,-246,-3497,11477,2297,-748,1885,5778 } }, + { "Sony ILCE-7RM5", 0, 0, + { 8200, -2976, -719, -4296, 12053, 2532, -429, 1282, 5774 } }, // From LibRaw + { "Sony ILCE-7RM4", 0, 0, // same CMs: ILCE-7RM4, ILCE-7RM4A + { 7662, -2686,-660,-5240, 12965,2530, -796, 1508, 6167 } }, // From LibRaw { "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-7CR", 0, 0, + { 8200,-2976,-719,-4296,12053,2532,-429,1282,5774 } }, // temp // From LibRaw + { "Sony ILCE-7CM2", 0, 0, + { 7460,-2365,-588,-5687,13442,2474,-624,1156,6584 } }, // temp // From LibRaw + { "Sony ILCE-7C", 0, 0, + { 7374,-2389,-551,-5435,13162,2519,-1006,1795,6552 } }, // From LibRaw { "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 ILME-FX30", 0, 0, + { 6972, -2408, -600, -4330, 12101, 2515, -388, 1277, 5847 } }, // From LibRaw + { "Sony ILME-FX3", 0, 0, + { 6912, -2127, -469, -4470, 12175, 2587, -398, 1478, 6492 } }, // From LibRaw { "Sony NEX-5N", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, { "Sony NEX-5R", 0, 0, @@ -9242,6 +9705,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, { "Sony NEX-7", 0, 0, { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, + { "Sony NEX-VG30", 0, 0, + { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, // From LibRaw + { "Sony NEX-VG900", 0, 0, + { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, // From LibRaw { "Sony NEX", 0, 0, /* NEX-C3, NEX-F3 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, { "Sony SLT-A33", 0, 0, From a1c6ce5dd2b34df5a55e0073aef5b07deaab4280 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 16 Jun 2024 07:35:50 +0200 Subject: [PATCH 49/78] Selective editing - adds the feather slider for each Graduated Filter (#7079) * Feather GF color and vibrance * Feather exposure * Graduated filer feather wavelet * Graduated filter feather log * Graduated filter Cam16 feather * Change history msg * GF shadows highlight feather * GF mask common feather * Move feather settings in settings mask * Change history msg * Change label feather * Change 2 labels --- rtdata/languages/default | 18 ++++++++--- rtengine/iplocallab.cc | 43 ++++++++++++++++++++++++-- rtengine/procparams.cc | 34 ++++++++++++++++++++- rtengine/procparams.h | 8 +++++ rtgui/controlspotpanel.cc | 5 ++-- rtgui/locallabtools.cc | 63 +++++++++++++++++++++++++++++++++++++-- rtgui/locallabtools.h | 16 ++++++++++ rtgui/locallabtools2.cc | 60 +++++++++++++++++++++++++++++++++++++ rtgui/paramsedited.cc | 58 ++++++++++++++++++++++++++++++++++- rtgui/paramsedited.h | 8 +++++ 10 files changed, 300 insertions(+), 13 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 75d060dec..f8f7cf114 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1068,7 +1068,7 @@ HISTORY_MSG_829;Local - SH gradient angle HISTORY_MSG_830;Local - Color gradient strength L HISTORY_MSG_831;Local - Color gradient angle HISTORY_MSG_832;Local - Color gradient strength C -HISTORY_MSG_833;Local - TG - Feather gradient +HISTORY_MSG_833;Local - Mask gradient feather HISTORY_MSG_834;Local - Color gradient strength H HISTORY_MSG_835;Local - Vib gradient strength L HISTORY_MSG_836;Local - Vib gradient angle @@ -1502,6 +1502,15 @@ HISTORY_MSG_LOCAL_CIEMASK_STRU;Local Cie mask structure HISTORY_MSG_LOCAL_CIEMASK_STRU_TOOL;Local Cie mask structure as tool HISTORY_MSG_LOCAL_CIEMASK_WLC;Local CIECAM mask wavelet Lc HISTORY_MSG_LOCAL_CIEMASK_WLEV;Local CIECAM mask wavelet levels +HISTORY_MSG_LOCAL_FEATHERCOL;Local Color gradient feather +HISTORY_MSG_LOCAL_FEATHEREXE;Local Exp gradient feather +HISTORY_MSG_LOCAL_FEATHERVIB;Local Vib gradient feather +HISTORY_MSG_LOCAL_FEATHERWAV;Local Wav gradient feather +HISTORY_MSG_LOCAL_FEATHERLOG;Local Log gradient feather +HISTORY_MSG_LOCAL_FEATHERCIE;Local CIECAM gradient feather +HISTORY_MSG_LOCAL_FEATHERSH;Local SH gradient feather +HISTORY_MSG_LOCAL_FEATHERMAS;Local Mask common gradient feather + HISTORY_MSG_LOCAL_LOG_BLACKS;Local Log - Blacks distribution HISTORY_MSG_LOCAL_LOG_COMPR;Local Log - Compress brightness HISTORY_MSG_LOCAL_LOG_SAT;Local Log - Saturation control @@ -2929,7 +2938,7 @@ TP_LOCALLAB_CHRRT;Chroma TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) TP_LOCALLAB_CIE_SMOOTH_NONE;None TP_LOCALLAB_CIE_SMOOTH_EV;Ev based -TP_LOCALLAB_CIE_SMOOTHFRAME;Highlight attenuation & Levels +TP_LOCALLAB_CIE_SMOOTHFRAME;Highlight Attenuation & Levels TP_LOCALLAB_CIE_SMOOTH_GAMMA;Slope based TP_LOCALLAB_CIE_SMOOTH_GAMMA ROLLOFF;Gamma based TP_LOCALLAB_CIE_SMOOTH_LEVELS;Levels @@ -3089,7 +3098,8 @@ TP_LOCALLAB_FATLEVEL;Sigma TP_LOCALLAB_FATSAT;Saturation control TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. -TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +TP_LOCALLAB_FEATVALUE;Feather gradient +TP_LOCALLAB_FEATVALUE_MASK;Feather gradient (Grad. Filters Mask) TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform @@ -3566,7 +3576,7 @@ TP_LOCALLAB_SLOPESMOOTHR;Red balance (Slope) TP_LOCALLAB_SLOPESMOOTHG;Green balance (Slope) TP_LOCALLAB_SLOPESMOOTHB;Blue balance (Slope) TP_LOCALLAB_SLOSH;Slope -TP_LOCALLAB_SMOOTHCIE;Highlight attenuation +TP_LOCALLAB_SMOOTHCIE;Highlight Attenuation TP_LOCALLAB_SMOOTHCIE_LUM;Luminosity mode TP_LOCALLAB_SMOOTHCIE_SCA;Scale Yb Scene TP_LOCALLAB_SMOOTHCIE_YB;Scale Yb Viewing diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 1d03f7adc..9cf83d9cb 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -501,19 +501,25 @@ struct local_params { float angmaexp; float str_mas; float ang_mas; + float feather_mas; float strexp; float angexp; + float featherexp; float strSH; float angSH; + float featherSH; float strcol; float strcolab; float strcolh; float angcol; + float feathcol; float strvib; float strvibab; float strvibh; float angvib; + float feathervib; float angwav; + float featherwav; float strwav; float blendmaL; float radmaL; @@ -529,6 +535,7 @@ struct local_params { float basew; float anglog; + float featherlog; float strlog; float softradiusexp; float softradiuscol; @@ -804,6 +811,7 @@ struct local_params { float detailcie; float strgradcie; float anggradcie; + float feathercie; bool satcie; bool satlog; int sensilog; @@ -1367,22 +1375,29 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float angmaskexpo = ((float) locallab.spots.at(sp).angmaskexp); float strmask = ((float) locallab.spots.at(sp).str_mask); float angmask = ((float) locallab.spots.at(sp).ang_mask); + float feathermask = ((float) locallab.spots.at(sp).feather_mask); float strexpo = ((float) locallab.spots.at(sp).strexp); float angexpo = ((float) locallab.spots.at(sp).angexp); + float featherexpo = ((float) locallab.spots.at(sp).featherexp); float strSH = ((float) locallab.spots.at(sp).strSH); float angSH = ((float) locallab.spots.at(sp).angSH); + float featherSH = ((float) locallab.spots.at(sp).featherSH); float strcol = ((float) locallab.spots.at(sp).strcol); float strcolab = ((float) locallab.spots.at(sp).strcolab); float strcolh = ((float) locallab.spots.at(sp).strcolh); float angcol = ((float) locallab.spots.at(sp).angcol); + float feathcol = ((float) locallab.spots.at(sp).feathercol); float strvib = ((float) locallab.spots.at(sp).strvib); float strvibab = ((float) locallab.spots.at(sp).strvibab); float strvibh = ((float) locallab.spots.at(sp).strvibh); float angvib = ((float) locallab.spots.at(sp).angvib); + float feathervib = ((float) locallab.spots.at(sp).feathervib); float strwav = ((float) locallab.spots.at(sp).strwav); float angwav = ((float) locallab.spots.at(sp).angwav); + float featherwav = ((float) locallab.spots.at(sp).featherwav); float strlog = ((float) locallab.spots.at(sp).strlog); float anglog = ((float) locallab.spots.at(sp).anglog); + float featherlog = ((float) locallab.spots.at(sp).featherlog); float softradiusexpo = ((float) locallab.spots.at(sp).softradiusexp); float softradiuscolor = ((float) locallab.spots.at(sp).softradiuscol); float softradiusreti = ((float) locallab.spots.at(sp).softradiusret); @@ -1515,6 +1530,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float contciemask = (float) locallab.spots.at(sp).contcie; float strgradcie = ((float) locallab.spots.at(sp).strgradcie); float anggradcie = ((float) locallab.spots.at(sp).anggradcie); + float feathercie = ((float) locallab.spots.at(sp).feathercie); lp.comprlo = locallab.spots.at(sp).comprlog; lp.comprlocie = locallab.spots.at(sp).comprcie; @@ -1550,23 +1566,30 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.angmaexp = angmaskexpo; lp.str_mas = strmask; lp.ang_mas = angmask; + lp.feather_mas = feathermask; lp.strexp = strexpo; lp.angexp = angexpo; + lp.featherexp = featherexpo; lp.strSH = strSH; lp.angSH = angSH; + lp.featherSH = featherSH; lp.strcol = strcol; lp.strcolab = strcolab; lp.strcolh = strcolh; lp.angcol = angcol; + lp.feathcol = feathcol; lp.strvib = strvib; lp.strvibab = strvibab; lp.strvibh = strvibh; lp.angvib = angvib; + lp.feathervib = feathervib; lp.strwav = strwav; lp.angwav = angwav; + lp.featherwav = featherwav; lp.strlog = strlog; lp.anglog = anglog; + lp.featherlog = featherlog; lp.softradiusexp = softradiusexpo; lp.softradiuscol = softradiuscolor; lp.softradiusret = softradiusreti; @@ -1779,6 +1802,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.contciemask = 0.01f * contciemask; lp.strgradcie = strgradcie; lp.anggradcie = anggradcie; + lp.feathercie = feathercie; lp.blendmacie = blendmaskcie; lp.radmacie = radmaskcie; @@ -5621,19 +5645,24 @@ void calclocalGradientParams(const struct local_params& lp, struct grad_params& int h = bfh; float stops = 0.f; float angs = 0.f; + double varfeath = 0.25; //0.01f * lp.feath; if (indic == 0) { stops = -lp.strmaexp; angs = lp.angmaexp; + varfeath = 0.01f * lp.feath;//for all masks when present } else if (indic == 1) { stops = lp.strexp; angs = lp.angexp; + varfeath = 0.01f * lp.featherexp; } else if (indic == 2) { stops = lp.strSH; angs = lp.angSH; + varfeath = 0.01f * lp.featherSH; } else if (indic == 3) { stops = lp.strcol; angs = lp.angcol; + varfeath = 0.01f * lp.feathcol; } else if (indic == 4) { float redu = 1.f; @@ -5645,41 +5674,49 @@ void calclocalGradientParams(const struct local_params& lp, struct grad_params& stops = redu * lp.strcolab; angs = lp.angcol; + varfeath = 0.01f * lp.feathcol; } else if (indic == 5) { stops = lp.strcolab; angs = lp.angcol; + varfeath = 0.01f * lp.feathcol; } else if (indic == 6) { stops = lp.strcolh; angs = lp.angcol; + varfeath = 0.01f * lp.feathcol; } else if (indic == 7) { stops = lp.strvib; angs = lp.angvib; + varfeath = 0.01f * lp.feathervib; } else if (indic == 8) { float redu = 1.f; - if (lp.strvibab > 0.f) { redu = 0.7f; } else { redu = 0.5f; } - stops = redu * lp.strvibab; angs = lp.angvib; + varfeath = 0.01f * lp.feathervib; } else if (indic == 9) { stops = lp.strvibh; angs = lp.angvib; + varfeath = 0.01f * lp.feathervib; } else if (indic == 10) { stops = std::fabs(lp.strwav); angs = lp.angwav; + varfeath = 0.01f * lp.featherwav; } else if (indic == 11) { stops = lp.strlog; angs = lp.anglog; + varfeath = 0.01f * lp.featherlog; } else if (indic == 12) { stops = -lp.str_mas; angs = lp.ang_mas; + varfeath = 0.01f * lp.feather_mas; } else if (indic == 15) { stops = lp.strgradcie; angs = lp.anggradcie; + varfeath = 0.01f * lp.feathercie; } @@ -5687,7 +5724,7 @@ void calclocalGradientParams(const struct local_params& lp, struct grad_params& double gradient_center_x = LIM01((lp.xc - xstart) / bfw); double gradient_center_y = LIM01((lp.yc - ystart) / bfh); double gradient_angle = static_cast(angs) / 180.0 * rtengine::RT_PI; - double varfeath = 0.01f * lp.feath; + // double varfeath = 0.01f * lp.feath; //printf("xstart=%f ysta=%f lpxc=%f lpyc=%f stop=%f bb=%f cc=%f ang=%f ff=%d gg=%d\n", xstart, ystart, lp.xc, lp.yc, gradient_stops, gradient_center_x, gradient_center_y, gradient_angle, w, h); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9d759a723..1ba92c366 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3044,6 +3044,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : strcolab(0.), strcolh(0.), angcol(0.), + feathercol(25.), blurcolde(5), blurcol(0.2), contcol(0.), @@ -3286,6 +3287,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : gamex(1.), strexp(0.), angexp(0.), + featherexp(25.), excurve{ static_cast(DCT_NURBS), 0.0, @@ -3436,6 +3438,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : blurSHde(5), strSH(0.), angSH(0.), + featherSH(25.), inverssh(false), chromaskSH(0.0), gammaskSH(1.0), @@ -3531,6 +3534,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : strvibab(0.0), strvibh(0.0), angvib(0.0), + feathervib(25.0), Lmaskvibcurve{ static_cast(DCT_NURBS), 0.0, @@ -3975,6 +3979,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : sigmalc2(1.0), strwav(0.0), angwav(0.0), + featherwav(25.0), strengthw(0.0), sigmaed(1.0), radiusw(15.0), @@ -4259,6 +4264,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : baselog(2.), strlog(0.0), anglog(0.0), + featherlog(25.0), CCmaskcurveL{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -4386,6 +4392,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : shadmask(0.0), str_mask(0), ang_mask(0), + feather_mask(25), HHhmask_curve{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -4669,6 +4676,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : surroundcie("Average"), strgradcie(0.), anggradcie(0.), + feathercie(25.), enacieMask(false), enacieMaskall(false), CCmaskciecurve{ @@ -4912,6 +4920,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && strcolab == other.strcolab && strcolh == other.strcolh && angcol == other.angcol + && feathercol == other.feathercol && blurcolde == other.blurcolde && blurcol == other.blurcol && contcol == other.contcol @@ -4974,6 +4983,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && gamex == other.gamex && strexp == other.strexp && angexp == other.angexp + && featherexp == other.featherexp && excurve == other.excurve && norm == other.norm && inversex == other.inversex @@ -5037,6 +5047,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && blurSHde == other.blurSHde && strSH == other.strSH && angSH == other.angSH + && featherSH == other.featherSH && inverssh == other.inverssh && chromaskSH == other.chromaskSH && gammaskSH == other.gammaskSH @@ -5082,6 +5093,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && strvibab == other.strvibab && strvibh == other.strvibh && angvib == other.angvib + && feathervib == other.feathervib && Lmaskvibcurve == other.Lmaskvibcurve && recothresv == other.recothresv && lowthresv == other.lowthresv @@ -5298,6 +5310,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && sigmalc2 == other.sigmalc2 && strwav == other.strwav && angwav == other.angwav + && featherwav == other.featherwav && strengthw == other.strengthw && sigmaed == other.sigmaed && radiusw == other.radiusw @@ -5412,6 +5425,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && surround == other.surround && strlog == other.strlog && anglog == other.anglog + && featherlog == other.featherlog && CCmaskcurveL == other.CCmaskcurveL && LLmaskcurveL == other.LLmaskcurveL && HHmaskcurveL == other.HHmaskcurveL @@ -5450,6 +5464,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && shadmask == other.shadmask && str_mask == other.str_mask && ang_mask == other.ang_mask + && feather_mask == other.feather_mask && HHhmask_curve == other.HHhmask_curve && Lmask_curve == other.Lmask_curve && LLmask_curvewav == other.LLmask_curvewav @@ -5584,6 +5599,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && detailcie == other.detailcie && strgradcie == other.strgradcie && anggradcie == other.anggradcie + && feathercie == other.feathercie && surroundcie == other.surroundcie && enacieMask == other.enacieMask && enacieMaskall == other.enacieMaskall @@ -6856,6 +6872,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->strcolab, "Locallab", "Strcolab_" + index_str, spot.strcolab, keyFile); saveToKeyfile(!pedited || spot_edited->strcolh, "Locallab", "Strcolh_" + index_str, spot.strcolh, keyFile); saveToKeyfile(!pedited || spot_edited->angcol, "Locallab", "Angcol_" + index_str, spot.angcol, keyFile); + saveToKeyfile(!pedited || spot_edited->feathercol, "Locallab", "Feathercol_" + index_str, spot.feathercol, keyFile); saveToKeyfile(!pedited || spot_edited->blurcolde, "Locallab", "Blurcolde_" + index_str, spot.blurcolde, keyFile); saveToKeyfile(!pedited || spot_edited->blurcol, "Locallab", "Blurcol_" + index_str, spot.blurcol, keyFile); saveToKeyfile(!pedited || spot_edited->contcol, "Locallab", "Contcol_" + index_str, spot.contcol, keyFile); @@ -6919,6 +6936,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->gamex, "Locallab", "Gamex_" + index_str, spot.gamex, keyFile); saveToKeyfile(!pedited || spot_edited->strexp, "Locallab", "Strexp_" + index_str, spot.strexp, keyFile); saveToKeyfile(!pedited || spot_edited->angexp, "Locallab", "Angexp_" + index_str, spot.angexp, keyFile); + saveToKeyfile(!pedited || spot_edited->featherexp, "Locallab", "Featherexp_" + index_str, spot.featherexp, keyFile); saveToKeyfile(!pedited || spot_edited->excurve, "Locallab", "ExCurve_" + index_str, spot.excurve, keyFile); saveToKeyfile(!pedited || spot_edited->norm, "Locallab", "Norm_" + index_str, spot.norm, keyFile); saveToKeyfile(!pedited || spot_edited->inversex, "Locallab", "Inversex_" + index_str, spot.inversex, keyFile); @@ -6979,6 +6997,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->blurSHde, "Locallab", "BlurSHde_" + index_str, spot.blurSHde, keyFile); saveToKeyfile(!pedited || spot_edited->strSH, "Locallab", "StrSH_" + index_str, spot.strSH, keyFile); saveToKeyfile(!pedited || spot_edited->angSH, "Locallab", "AngSH_" + index_str, spot.angSH, keyFile); + saveToKeyfile(!pedited || spot_edited->featherSH, "Locallab", "FeatherSH_" + index_str, spot.featherSH, keyFile); saveToKeyfile(!pedited || spot_edited->inverssh, "Locallab", "Inverssh_" + index_str, spot.inverssh, keyFile); saveToKeyfile(!pedited || spot_edited->chromaskSH, "Locallab", "ChromaskSH_" + index_str, spot.chromaskSH, keyFile); saveToKeyfile(!pedited || spot_edited->gammaskSH, "Locallab", "GammaskSH_" + index_str, spot.gammaskSH, keyFile); @@ -7024,6 +7043,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->strvibab, "Locallab", "Strvibab_" + index_str, spot.strvibab, keyFile); saveToKeyfile(!pedited || spot_edited->strvibh, "Locallab", "Strvibh_" + index_str, spot.strvibh, keyFile); saveToKeyfile(!pedited || spot_edited->angvib, "Locallab", "Angvib_" + index_str, spot.angvib, keyFile); + saveToKeyfile(!pedited || spot_edited->angvib, "Locallab", "Feathervib_" + index_str, spot.feathervib, keyFile); saveToKeyfile(!pedited || spot_edited->Lmaskvibcurve, "Locallab", "LmaskvibCurve_" + index_str, spot.Lmaskvibcurve, keyFile); saveToKeyfile(!pedited || spot_edited->recothresv, "Locallab", "Recothresv_" + index_str, spot.recothresv, keyFile); saveToKeyfile(!pedited || spot_edited->lowthresv, "Locallab", "Lowthresv_" + index_str, spot.lowthresv, keyFile); @@ -7246,6 +7266,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->sigmalc2, "Locallab", "Sigmalc2_" + index_str, spot.sigmalc2, keyFile); saveToKeyfile(!pedited || spot_edited->strwav, "Locallab", "Strwav_" + index_str, spot.strwav, keyFile); saveToKeyfile(!pedited || spot_edited->angwav, "Locallab", "Angwav_" + index_str, spot.angwav, keyFile); + saveToKeyfile(!pedited || spot_edited->featherwav, "Locallab", "Featherwav_" + index_str, spot.featherwav, keyFile); saveToKeyfile(!pedited || spot_edited->strengthw, "Locallab", "Strengthw_" + index_str, spot.strengthw, keyFile); saveToKeyfile(!pedited || spot_edited->sigmaed, "Locallab", "Sigmaed_" + index_str, spot.sigmaed, keyFile); saveToKeyfile(!pedited || spot_edited->radiusw, "Locallab", "Radiusw_" + index_str, spot.radiusw, keyFile); @@ -7358,6 +7379,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->surround, "Locallab", "Surround_" + index_str, spot.surround, keyFile); saveToKeyfile(!pedited || spot_edited->strlog, "Locallab", "Strlog_" + index_str, spot.strlog, keyFile); saveToKeyfile(!pedited || spot_edited->anglog, "Locallab", "Anglog_" + index_str, spot.anglog, keyFile); + saveToKeyfile(!pedited || spot_edited->featherlog, "Locallab", "Featherlog_" + index_str, spot.featherlog, keyFile); saveToKeyfile(!pedited || spot_edited->CCmaskcurveL, "Locallab", "CCmaskCurveL_" + index_str, spot.CCmaskcurveL, keyFile); saveToKeyfile(!pedited || spot_edited->LLmaskcurveL, "Locallab", "LLmaskCurveL_" + index_str, spot.LLmaskcurveL, keyFile); saveToKeyfile(!pedited || spot_edited->HHmaskcurveL, "Locallab", "HHmaskCurveL_" + index_str, spot.HHmaskcurveL, keyFile); @@ -7397,6 +7419,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->shadmask, "Locallab", "Shadmask_" + index_str, spot.shadmask, keyFile); saveToKeyfile(!pedited || spot_edited->str_mask, "Locallab", "Str_mask_" + index_str, spot.str_mask, keyFile); saveToKeyfile(!pedited || spot_edited->ang_mask, "Locallab", "Ang_mask_" + index_str, spot.ang_mask, keyFile); + saveToKeyfile(!pedited || spot_edited->feather_mask, "Locallab", "Feather_mask_" + index_str, spot.feather_mask, keyFile); saveToKeyfile(!pedited || spot_edited->HHhmask_curve, "Locallab", "HHhmask_Curve_" + index_str, spot.HHhmask_curve, keyFile); saveToKeyfile(!pedited || spot_edited->Lmask_curve, "Locallab", "Lmask_Curve_" + index_str, spot.Lmask_curve, keyFile); saveToKeyfile(!pedited || spot_edited->LLmask_curvewav, "Locallab", "LLmask_Curvewav_" + index_str, spot.LLmask_curvewav, keyFile); @@ -7534,6 +7557,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->detailcie, "Locallab", "Detailcie_" + index_str, spot.detailcie, keyFile); saveToKeyfile(!pedited || spot_edited->strgradcie, "Locallab", "Strgradcie_" + index_str, spot.strgradcie, keyFile); saveToKeyfile(!pedited || spot_edited->anggradcie, "Locallab", "Anggradcie_" + index_str, spot.anggradcie, keyFile); + saveToKeyfile(!pedited || spot_edited->feathercie, "Locallab", "Feathercie_" + index_str, spot.feathercie, keyFile); saveToKeyfile(!pedited || spot_edited->surroundcie, "Locallab", "Surroundcie_" + index_str, spot.surroundcie, keyFile); saveToKeyfile(!pedited || spot_edited->enacieMask, "Locallab", "EnacieMask_" + index_str, spot.enacieMask, keyFile); saveToKeyfile(!pedited || spot_edited->enacieMaskall, "Locallab", "EnacieMaskall_" + index_str, spot.enacieMaskall, keyFile); @@ -9126,6 +9150,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Strcolab_" + index_str, spot.strcolab, spotEdited.strcolab); assignFromKeyfile(keyFile, "Locallab", "Strcolh_" + index_str, spot.strcolh, spotEdited.strcolh); assignFromKeyfile(keyFile, "Locallab", "Angcol_" + index_str, spot.angcol, spotEdited.angcol); + assignFromKeyfile(keyFile, "Locallab", "Fetahercol_" + index_str, spot.feathercol, spotEdited.feathercol); assignFromKeyfile(keyFile, "Locallab", "Blurcolde_" + index_str, spot.blurcolde, spotEdited.blurcolde); assignFromKeyfile(keyFile, "Locallab", "Blurcol_" + index_str, spot.blurcol, spotEdited.blurcol); assignFromKeyfile(keyFile, "Locallab", "Contcol_" + index_str, spot.contcol, spotEdited.contcol); @@ -9202,6 +9227,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Gamex_" + index_str, spot.gamex, spotEdited.gamex); assignFromKeyfile(keyFile, "Locallab", "Strexp_" + index_str, spot.strexp, spotEdited.strexp); assignFromKeyfile(keyFile, "Locallab", "Angexp_" + index_str, spot.angexp, spotEdited.angexp); + assignFromKeyfile(keyFile, "Locallab", "Featherexp_" + index_str, spot.featherexp, spotEdited.featherexp); assignFromKeyfile(keyFile, "Locallab", "ExCurve_" + index_str, spot.excurve, spotEdited.excurve); assignFromKeyfile(keyFile, "Locallab", "Norm_" + index_str, spot.norm, spotEdited.norm); assignFromKeyfile(keyFile, "Locallab", "Inversex_" + index_str, spot.inversex, spotEdited.inversex); @@ -9266,6 +9292,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "BlurSHde_" + index_str, spot.blurSHde, spotEdited.blurSHde); assignFromKeyfile(keyFile, "Locallab", "StrSH_" + index_str, spot.strSH, spotEdited.strSH); assignFromKeyfile(keyFile, "Locallab", "AngSH_" + index_str, spot.angSH, spotEdited.angSH); + assignFromKeyfile(keyFile, "Locallab", "FeatherSH_" + index_str, spot.featherSH, spotEdited.featherSH); assignFromKeyfile(keyFile, "Locallab", "Inverssh_" + index_str, spot.inverssh, spotEdited.inverssh); assignFromKeyfile(keyFile, "Locallab", "ChromaskSH_" + index_str, spot.chromaskSH, spotEdited.chromaskSH); assignFromKeyfile(keyFile, "Locallab", "GammaskSH_" + index_str, spot.gammaskSH, spotEdited.gammaskSH); @@ -9325,6 +9352,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Strvibab_" + index_str, spot.strvibab, spotEdited.strvibab); assignFromKeyfile(keyFile, "Locallab", "Strvibh_" + index_str, spot.strvibh, spotEdited.strvibh); assignFromKeyfile(keyFile, "Locallab", "Angvib_" + index_str, spot.angvib, spotEdited.angvib); + assignFromKeyfile(keyFile, "Locallab", "Feathervib_" + index_str, spot.feathervib, spotEdited.feathervib); assignFromKeyfile(keyFile, "Locallab", "LmaskvibCurve_" + index_str, spot.Lmaskvibcurve, spotEdited.Lmaskvibcurve); assignFromKeyfile(keyFile, "Locallab", "Recothresv_" + index_str, spot.recothresv, spotEdited.recothresv); assignFromKeyfile(keyFile, "Locallab", "Lowthresv_" + index_str, spot.lowthresv, spotEdited.lowthresv); @@ -9574,6 +9602,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Sigmalc2_" + index_str, spot.sigmalc2, spotEdited.sigmalc2); assignFromKeyfile(keyFile, "Locallab", "Strwav_" + index_str, spot.strwav, spotEdited.strwav); assignFromKeyfile(keyFile, "Locallab", "Angwav_" + index_str, spot.angwav, spotEdited.angwav); + assignFromKeyfile(keyFile, "Locallab", "Featherwav_" + index_str, spot.featherwav, spotEdited.featherwav); assignFromKeyfile(keyFile, "Locallab", "Strengthw_" + index_str, spot.strengthw, spotEdited.strengthw); assignFromKeyfile(keyFile, "Locallab", "Sigmaed_" + index_str, spot.sigmaed, spotEdited.sigmaed); assignFromKeyfile(keyFile, "Locallab", "Radiusw_" + index_str, spot.radiusw, spotEdited.radiusw); @@ -9703,6 +9732,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Surround_" + index_str, spot.surround, spotEdited.surround); assignFromKeyfile(keyFile, "Locallab", "Strlog_" + index_str, spot.strlog, spotEdited.strlog); assignFromKeyfile(keyFile, "Locallab", "Anglog_" + index_str, spot.anglog, spotEdited.anglog); + assignFromKeyfile(keyFile, "Locallab", "Featherlog_" + index_str, spot.featherlog, spotEdited.featherlog); assignFromKeyfile(keyFile, "Locallab", "CCmaskCurveL_" + index_str, spot.CCmaskcurveL, spotEdited.CCmaskcurveL); assignFromKeyfile(keyFile, "Locallab", "LLmaskCurveL_" + index_str, spot.LLmaskcurveL, spotEdited.LLmaskcurveL); assignFromKeyfile(keyFile, "Locallab", "HHmaskCurveL_" + index_str, spot.HHmaskcurveL, spotEdited.HHmaskcurveL); @@ -9740,6 +9770,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Shadmask_" + index_str, spot.shadmask, spotEdited.shadmask); assignFromKeyfile(keyFile, "Locallab", "Str_mask_" + index_str, spot.str_mask, spotEdited.str_mask); assignFromKeyfile(keyFile, "Locallab", "Ang_mask_" + index_str, spot.ang_mask, spotEdited.ang_mask); + assignFromKeyfile(keyFile, "Locallab", "Feather_mask_" + index_str, spot.feather_mask, spotEdited.feather_mask); assignFromKeyfile(keyFile, "Locallab", "HHhmask_Curve_" + index_str, spot.HHhmask_curve, spotEdited.HHhmask_curve); assignFromKeyfile(keyFile, "Locallab", "Lmask_Curve_" + index_str, spot.Lmask_curve, spotEdited.Lmask_curve); assignFromKeyfile(keyFile, "Locallab", "LLmask_Curvewav_" + index_str, spot.LLmask_curvewav, spotEdited.LLmask_curvewav); @@ -9902,7 +9933,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Surroundcie_" + index_str, spot.surroundcie, spotEdited.surroundcie); assignFromKeyfile(keyFile, "Locallab", "Strgradcie_" + index_str, spot.strgradcie, spotEdited.strgradcie); assignFromKeyfile(keyFile, "Locallab", "Anggradcie_" + index_str, spot.anggradcie, spotEdited.anggradcie); - + assignFromKeyfile(keyFile, "Locallab", "Feathercie_" + index_str, spot.feathercie, spotEdited.feathercie); + assignFromKeyfile(keyFile, "Locallab", "EnacieMask_" + index_str, spot.enacieMask, spotEdited.enacieMask); assignFromKeyfile(keyFile, "Locallab", "EnacieMaskall_" + index_str, spot.enacieMaskall, spotEdited.enacieMaskall); assignFromKeyfile(keyFile, "Locallab", "CCmaskcieCurve_" + index_str, spot.CCmaskciecurve, spotEdited.CCmaskciecurve); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index d1cad0a5d..d71c3d172 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1122,6 +1122,7 @@ struct LocallabParams { double strcolab; double strcolh; double angcol; + double feathercol; int blurcolde; double blurcol; double contcol; @@ -1184,6 +1185,7 @@ struct LocallabParams { double gamex; double strexp; double angexp; + double featherexp; std::vector excurve; bool norm; bool inversex; @@ -1239,6 +1241,7 @@ struct LocallabParams { int blurSHde; double strSH; double angSH; + double featherSH; bool inverssh; double chromaskSH; double gammaskSH; @@ -1284,6 +1287,7 @@ struct LocallabParams { double strvibab; double strvibh; double angvib; + double feathervib; std::vector Lmaskvibcurve; double recothresv; double lowthresv; @@ -1500,6 +1504,7 @@ struct LocallabParams { double sigmalc2; double strwav; double angwav; + double featherwav; double strengthw; double sigmaed; double radiusw; @@ -1606,6 +1611,7 @@ struct LocallabParams { double baselog; double strlog; double anglog; + double featherlog; std::vector CCmaskcurveL; std::vector LLmaskcurveL; std::vector HHmaskcurveL; @@ -1644,6 +1650,7 @@ struct LocallabParams { double shadmask; int str_mask; int ang_mask; + int feather_mask; std::vector HHhmask_curve; std::vector Lmask_curve; std::vector LLmask_curvewav; @@ -1780,6 +1787,7 @@ struct LocallabParams { Glib::ustring surroundcie; double strgradcie; double anggradcie; + double feathercie; bool enacieMask; bool enacieMaskall; std::vector CCmaskciecurve; diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc index 8588f6057..783f253c7 100644 --- a/rtgui/controlspotpanel.cc +++ b/rtgui/controlspotpanel.cc @@ -70,7 +70,7 @@ ControlSpotPanel::ControlSpotPanel(): transit_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITVALUE"), 2., 100., 0.1, 60.))), transitweak_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITWEAK"), 0.5, 25.0, 0.1, 1.0))), transitgrad_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITGRAD"), -1.0, 1.0, 0.01, 0.0))), - feather_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), + feather_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE_MASK"), 10., 100., 0.1, 25.))), struc_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRES"), 1.0, 12.0, 0.1, 4.0))), thresh_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESDELTAE"), 0.0, 15.0, 0.1, 2.0))), iter_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_PROXI"), 0.2, 10.0, 0.1, 2.0))), @@ -351,7 +351,7 @@ ControlSpotPanel::ControlSpotPanel(): transitBox->pack_start(*transit_); transitBox->pack_start(*transitweak_); transitBox->pack_start(*transitgrad_); - transitBox->pack_start(*feather_); + //transitBox->pack_start(*feather_); expTransGrad_->add(*transitBox, false); pack_start(*expTransGrad_, false, false); @@ -504,6 +504,7 @@ ControlSpotPanel::ControlSpotPanel(): maskBox->pack_start(*deltae_); maskBox->pack_start(*scopemask_); maskBox->pack_start(*denoichmask_); + maskBox->pack_start(*feather_); // maskBox->pack_start(*shortc_); maskBox->pack_start(*lumask_); // maskBox->pack_start(*savrest_); diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index fd4ed22be..4c68b004e 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -476,6 +476,7 @@ LocallabColor::LocallabColor(): strcolab(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRCHRO"), -6., 6., 0.05, 0.))), strcolh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRHUE"), -6., 6., 0.05, 0.))), angcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + feathercol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), expcurvcol(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPCURV")))), labqualcurv(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_QUALCURV_METHOD") + ":"))), qualitycurveMethod(Gtk::manage(new MyComboBoxText())), @@ -541,8 +542,9 @@ LocallabColor::LocallabColor(): csThresholdcol(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 0, 9, 0, 0, 6, 5, 0, false))) { auto m = ProcEventMapper::getInstance(); + //rtengine::ProcEvent EvlocallabenacieMaskall; + Evlocallabfeathercol = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERCOL"); Evlocallabpreviewcol = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWCOL"); - set_orientation(Gtk::ORIENTATION_VERTICAL); float R, G, B; @@ -609,6 +611,7 @@ LocallabColor::LocallabColor(): strcolh->set_tooltip_text(M("TP_LOCALLAB_GRADSTRHUE_TOOLTIP")); angcol->setAdjusterListener(this); + feathercol->setAdjusterListener(this); setExpandAlignProperties(expcurvcol, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); @@ -879,6 +882,7 @@ LocallabColor::LocallabColor(): gradcolBox->pack_start(*strcolab); gradcolBox->pack_start(*strcolh); gradcolBox->pack_start(*angcol); + gradcolBox->pack_start(*feathercol); expgradcol->add(*gradcolBox, false); pack_start(*expgradcol, false, false); ToolParamBlock* const curvBox = Gtk::manage(new ToolParamBlock()); @@ -1291,6 +1295,7 @@ void LocallabColor::read(const rtengine::procparams::ProcParams* pp, const Param strcolab->setValue(spot.strcolab); strcolh->setValue(spot.strcolh); angcol->setValue(spot.angcol); + feathercol->setValue(spot.feathercol); if (spot.qualitycurveMethod == "none") { qualitycurveMethod->set_active(0); @@ -1472,6 +1477,7 @@ void LocallabColor::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pe spot.strcolab = strcolab->getValue(); spot.strcolh = strcolh->getValue(); spot.angcol = angcol->getValue(); + spot.feathercol = feathercol->getValue(); spot.recothresc = recothresc->getValue(); spot.lowthresc = lowthresc->getValue(); @@ -1626,6 +1632,7 @@ void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParam strcolab->setDefault(defSpot.strcolab); strcolh->setDefault(defSpot.strcolh); angcol->setDefault(defSpot.angcol); + feathercol->setDefault(defSpot.feathercol); mercol->setDefault(defSpot.mercol); opacol->setDefault(defSpot.opacol); conthrcol->setDefault(defSpot.conthrcol); @@ -1786,6 +1793,13 @@ void LocallabColor::adjusterChanged(Adjuster* a, double newval) } } + if (a == feathercol) { + if (listener) { + listener->panelChanged(Evlocallabfeathercol, + feathercol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == mercol) { if (listener) { listener->panelChanged(Evlocallabmercol, @@ -2147,6 +2161,7 @@ void LocallabColor::convertParamToSimple() softradiuscol->setValue(defSpot.softradiuscol); strcol->setValue(defSpot.strcol); angcol->setValue(defSpot.angcol); + feathercol->setValue(defSpot.feathercol); gamc->setValue(defSpot.gamc); if (defSpot.qualitycurveMethod == "none") { @@ -2706,6 +2721,7 @@ LocallabExposure::LocallabExposure(): expgradexp(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), strexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4., 4., 0.05, 0.))), angexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + featherexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), softradiusexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), inversex(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), expmaskexp(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWE")))), @@ -2737,6 +2753,7 @@ LocallabExposure::LocallabExposure(): const LocallabParams::LocallabSpot defSpot; auto m = ProcEventMapper::getInstance(); Evlocallabpreviewexe = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWEXE"); + Evlocallabfeatherexp = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHEREXE"); // Parameter Exposure specific widgets expMethod->append(M("TP_LOCALLAB_STD")); @@ -2811,6 +2828,7 @@ LocallabExposure::LocallabExposure(): angexp->setAdjusterListener(this); angexp->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + featherexp->setAdjusterListener(this); softradiusexp->setLogScale(10, 0); softradiusexp->setAdjusterListener(this); @@ -2954,6 +2972,7 @@ LocallabExposure::LocallabExposure(): ToolParamBlock* const gradBox = Gtk::manage(new ToolParamBlock()); gradBox->pack_start(*strexp); gradBox->pack_start(*angexp); + gradBox->pack_start(*featherexp); expgradexp->add(*gradBox, false); pack_start(*expgradexp); pack_start(*softradiusexp); @@ -3272,6 +3291,7 @@ void LocallabExposure::read(const rtengine::procparams::ProcParams* pp, const Pa shapeexpos->setCurve(spot.excurve); strexp->setValue(spot.strexp); angexp->setValue(spot.angexp); + featherexp->setValue(spot.featherexp); softradiusexp->setValue(spot.softradiusexp); norm->set_active(spot.norm); fatsatur->set_active(spot.fatsatur); @@ -3363,6 +3383,7 @@ void LocallabExposure::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.excurve = shapeexpos->getCurve(); spot.strexp = strexp->getValue(); spot.angexp = angexp->getValue(); + spot.featherexp = featherexp->getValue(); spot.softradiusexp = softradiusexp->getValue(); spot.inversex = inversex->get_active(); spot.norm = norm->get_active(); @@ -3416,6 +3437,7 @@ void LocallabExposure::setDefaults(const rtengine::procparams::ProcParams* defPa expchroma->setDefault((double)defSpot.expchroma); strexp->setDefault(defSpot.strexp); angexp->setDefault(defSpot.angexp); + featherexp->setDefault(defSpot.featherexp); softradiusexp->setDefault(defSpot.softradiusexp); blendmaskexp->setDefault((double)defSpot.blendmaskexp); radmaskexp->setDefault(defSpot.radmaskexp); @@ -3640,6 +3662,13 @@ void LocallabExposure::adjusterChanged(Adjuster* a, double newval) } } + if (a == featherexp) { + if (listener) { + listener->panelChanged(Evlocallabfeatherexp, + featherexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == softradiusexp) { if (listener) { listener->panelChanged(Evlocallabsoftradiusexp, @@ -3796,6 +3825,7 @@ void LocallabExposure::convertParamToSimple() // Set hidden specific GUI widgets in Simple mode to default spot values strexp->setValue(defSpot.strexp); angexp->setValue(defSpot.angexp); + featherexp->setValue(defSpot.featherexp); softradiusexp->setValue(defSpot.softradiusexp); enaExpMask->set_active(defSpot.enaExpMask); enaExpMaskaft->set_active(defSpot.enaExpMaskaft); @@ -4240,6 +4270,7 @@ LocallabShadow::LocallabShadow(): expgradsh(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), strSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4., 4., 0.05, 0.))), angSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + featherSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), inverssh(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), expmasksh(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWS")))), showmaskSHMethod(Gtk::manage(new MyComboBoxText())), @@ -4265,6 +4296,7 @@ LocallabShadow::LocallabShadow(): { auto m = ProcEventMapper::getInstance(); Evlocallabpreviewsh = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWSH"); + EvlocallabfeatherSH = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERSH"); set_orientation(Gtk::ORIENTATION_VERTICAL); @@ -4316,6 +4348,7 @@ LocallabShadow::LocallabShadow(): angSH->setAdjusterListener(this); angSH->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + featherSH->setAdjusterListener(this); inversshConn = inverssh->signal_toggled().connect(sigc::mem_fun(*this, &LocallabShadow::inversshChanged)); inverssh->set_tooltip_text(M("TP_LOCALLAB_INVERS_TOOLTIP")); @@ -4427,6 +4460,7 @@ LocallabShadow::LocallabShadow(): ToolParamBlock* const gradSHBox = Gtk::manage(new ToolParamBlock()); gradSHBox->pack_start(*strSH); gradSHBox->pack_start(*angSH); + gradSHBox->pack_start(*featherSH); expgradsh->add(*gradSHBox, false); pack_start(*expgradsh); // pack_start(*inverssh); @@ -4718,6 +4752,7 @@ void LocallabShadow::read(const rtengine::procparams::ProcParams* pp, const Para sloSH->setValue(spot.sloSH); strSH->setValue(spot.strSH); angSH->setValue(spot.angSH); + featherSH->setValue(spot.featherSH); inverssh->set_active(spot.inverssh); enaSHMask->set_active(spot.enaSHMask); CCmaskSHshape->setCurve(spot.CCmaskSHcurve); @@ -4784,6 +4819,7 @@ void LocallabShadow::write(rtengine::procparams::ProcParams* pp, ParamsEdited* p spot.sloSH = sloSH->getValue(); spot.strSH = strSH->getValue(); spot.angSH = angSH->getValue(); + spot.featherSH = featherSH->getValue(); spot.inverssh = inverssh->get_active(); spot.enaSHMask = enaSHMask->get_active(); spot.LLmaskSHcurve = LLmaskSHshape->getCurve(); @@ -4833,6 +4869,7 @@ void LocallabShadow::setDefaults(const rtengine::procparams::ProcParams* defPara sloSH->setDefault(defSpot.sloSH); strSH->setDefault(defSpot.strSH); angSH->setDefault(defSpot.angSH); + featherSH->setDefault(defSpot.featherSH); blendmaskSH->setDefault((double)defSpot.blendmaskSH); radmaskSH->setDefault(defSpot.radmaskSH); lapmaskSH->setDefault(defSpot.lapmaskSH); @@ -4994,6 +5031,13 @@ void LocallabShadow::adjusterChanged(Adjuster* a, double newval) } } + if (a == featherSH) { + if (listener) { + listener->panelChanged(EvlocallabfeatherSH, + featherSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == blendmaskSH) { if (listener) { listener->panelChanged(EvlocallabblendmaskSH, @@ -5133,6 +5177,7 @@ void LocallabShadow::convertParamToSimple() sloSH->setValue(defSpot.sloSH); strSH->setValue(defSpot.strSH); angSH->setValue(defSpot.angSH); + featherSH->setValue(defSpot.featherSH); showmaskSHMethod->set_active(0); showmaskSHMethodinv->set_active(0); enaSHMask->set_active(defSpot.enaSHMask); @@ -5450,6 +5495,7 @@ LocallabVibrance::LocallabVibrance(): strvibab(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRCHRO"), -4., 4., 0.05, 0.))), strvibh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRHUE2"), -6., 6., 0.05, 0.))), angvib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + feathervib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), expmaskvib(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWVI")))), showmaskvibMethod(Gtk::manage(new MyComboBoxText())), enavibMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), @@ -5469,7 +5515,7 @@ LocallabVibrance::LocallabVibrance(): { auto m = ProcEventMapper::getInstance(); Evlocallabpreviewvib = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWVIB"); - + Evlocallabfeathervib = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERVIB"); set_orientation(Gtk::ORIENTATION_VERTICAL); float R, G, B; @@ -5533,6 +5579,7 @@ LocallabVibrance::LocallabVibrance(): angvib->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); angvib->setAdjusterListener(this); + feathervib->setAdjusterListener(this); previewvib->set_active(false); previewvibConn = previewvib->signal_clicked().connect( @@ -5620,6 +5667,7 @@ LocallabVibrance::LocallabVibrance(): gradvibBox->pack_start(*strvibab); gradvibBox->pack_start(*strvibh); gradvibBox->pack_start(*angvib); + gradvibBox->pack_start(*feathervib); expgradvib->add(*gradvibBox, false); pack_start(*expgradvib); ToolParamBlock* const maskvibBox = Gtk::manage(new ToolParamBlock()); @@ -5872,6 +5920,7 @@ void LocallabVibrance::read(const rtengine::procparams::ProcParams* pp, const Pa strvibab->setValue(spot.strvibab); strvibh->setValue(spot.strvibh); angvib->setValue(spot.angvib); + feathervib->setValue(spot.feathervib); enavibMask->set_active(spot.enavibMask); CCmaskvibshape->setCurve(spot.CCmaskvibcurve); LLmaskvibshape->setCurve(spot.LLmaskvibcurve); @@ -5926,6 +5975,7 @@ void LocallabVibrance::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.strvibab = strvibab->getValue(); spot.strvibh = strvibh->getValue(); spot.angvib = angvib->getValue(); + spot.feathervib = feathervib->getValue(); spot.enavibMask = enavibMask->get_active(); spot.CCmaskvibcurve = CCmaskvibshape->getCurve(); spot.LLmaskvibcurve = LLmaskvibshape->getCurve(); @@ -5964,6 +6014,7 @@ void LocallabVibrance::setDefaults(const rtengine::procparams::ProcParams* defPa strvibab->setDefault(defSpot.strvibab); strvibh->setDefault(defSpot.strvibh); angvib->setDefault(defSpot.angvib); + feathervib->setDefault(defSpot.feathervib); blendmaskvib->setDefault((double)defSpot.blendmaskvib); radmaskvib->setDefault(defSpot.radmaskvib); lapmaskvib->setDefault(defSpot.lapmaskvib); @@ -6079,6 +6130,13 @@ void LocallabVibrance::adjusterChanged(Adjuster* a, double newval) } } + if (a == feathervib) { + if (listener) { + listener->panelChanged(Evlocallabfeathervib, + feathervib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == blendmaskvib) { if (listener) { listener->panelChanged(Evlocallabblendmaskvi, @@ -6277,6 +6335,7 @@ void LocallabVibrance::convertParamToSimple() // Set hidden specific GUI widgets in Simple mode to default spot values strvib->setValue(defSpot.strvib); angvib->setValue(defSpot.angvib); + feathervib->setValue(defSpot.feathervib); showmaskvibMethod->set_active(0); enavibMask->set_active(defSpot.enavibMask); // CCmaskvibshape->setCurve(defSpot.CCmaskvibcurve); diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index 17f9bd5cb..828615ba3 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -123,6 +123,14 @@ protected: rtengine::ProcEvent Evlocallabstrgradcie; rtengine::ProcEvent Evlocallabdetailciejz; rtengine::ProcEvent EvlocallabenacieMaskall; + rtengine::ProcEvent Evlocallabfeathercol; + rtengine::ProcEvent Evlocallabfeathervib; + rtengine::ProcEvent Evlocallabfeatherexp; + rtengine::ProcEvent Evlocallabfeatherwav; + rtengine::ProcEvent Evlocallabfeatherlog; + rtengine::ProcEvent Evlocallabfeathercie; + rtengine::ProcEvent EvlocallabfeatherSH; + rtengine::ProcEvent Evlocallabfeather_mask; // LocallabTool parameters bool needMode; bool isLocActivated; @@ -278,6 +286,7 @@ private: Adjuster* const strcolab; Adjuster* const strcolh; Adjuster* const angcol; + Adjuster* const feathercol; MyExpander* const expcurvcol; Gtk::Label* const labqualcurv; MyComboBoxText* const qualitycurveMethod; @@ -451,6 +460,7 @@ private: MyExpander* const expgradexp; Adjuster* const strexp; Adjuster* const angexp; + Adjuster* const featherexp; Adjuster* const softradiusexp; Gtk::CheckButton* const inversex; MyExpander* const expmaskexp; @@ -559,6 +569,7 @@ private: MyExpander* const expgradsh; Adjuster* const strSH; Adjuster* const angSH; + Adjuster* const featherSH; Gtk::CheckButton* const inverssh; MyExpander* const expmasksh; MyComboBoxText* const showmaskSHMethod; @@ -661,6 +672,7 @@ private: Adjuster* const strvibab; Adjuster* const strvibh; Adjuster* const angvib; + Adjuster* const feathervib; MyExpander* const expmaskvib; MyComboBoxText* const showmaskvibMethod; Gtk::CheckButton* const enavibMask; @@ -1240,6 +1252,7 @@ private: Adjuster* const sigmalc2; Adjuster* const strwav; Adjuster* const angwav; + Adjuster* const featherwav; Gtk::CheckButton* const wavedg; Adjuster* const strengthw; Adjuster* const sigmaed; @@ -1506,6 +1519,7 @@ private: Gtk::Frame* const gradlogFrame; Adjuster* const strlog; Adjuster* const anglog; + Adjuster* const featherlog; MyExpander* const expmaskL; MyComboBoxText* const showmaskLMethod; Gtk::CheckButton* const enaLMask; @@ -1613,6 +1627,7 @@ private: ThresholdAdjuster* const csThresholdmask; Gtk::Frame* const gradFramemask; Adjuster* const str_mask; + Adjuster* const feather_mask; Adjuster* const ang_mask; sigc::connection showmask_MethodConn, previewmasConn, enamaskConn, toolmaskConn, fftmaskConn; @@ -1866,6 +1881,7 @@ private: MyExpander* const expgradcie; Adjuster* const strgradcie; Adjuster* const anggradcie; + Adjuster* const feathercie; MyExpander* const exprecovcie; Gtk::Label* const maskusablecie; diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index af09224b5..b13148cd1 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -2534,6 +2534,7 @@ LocallabContrast::LocallabContrast(): sigmalc2(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), strwav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4.0, 4.0, 0.05, 0.))), angwav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + featherwav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), wavedg(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_EDGFRA")))), strengthw(Gtk::manage(new Adjuster(M("TP_WAVELET_EDVAL"), 0., 100.0, 0.5, 0.))), sigmaed(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), @@ -2602,6 +2603,7 @@ LocallabContrast::LocallabContrast(): { auto m = ProcEventMapper::getInstance(); Evlocallabpreviewlc = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWLC"); + Evlocallabfeatherwav = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERWAV"); set_orientation(Gtk::ORIENTATION_VERTICAL); @@ -2708,6 +2710,7 @@ LocallabContrast::LocallabContrast(): strwav->setAdjusterListener(this); angwav->setAdjusterListener(this); + featherwav->setAdjusterListener(this); wavedgConn = wavedg->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::wavedgChanged)); @@ -2949,6 +2952,7 @@ LocallabContrast::LocallabContrast(): gradwavBox->pack_start(*sigmalc2); gradwavBox->pack_start(*strwav); gradwavBox->pack_start(*angwav); + gradwavBox->pack_start(*featherwav); gradwavFrame->add(*gradwavBox); blurcontBox->pack_start(*gradwavFrame); Gtk::Frame* const edgFrame = Gtk::manage(new Gtk::Frame()); @@ -3400,6 +3404,7 @@ void LocallabContrast::read(const rtengine::procparams::ProcParams* pp, const Pa sigmalc2->setValue(spot.sigmalc2); strwav->setValue(spot.strwav); angwav->setValue(spot.angwav); + featherwav->setValue(spot.featherwav); wavedg->set_active(spot.wavedg); strengthw->setValue(spot.strengthw); sigmaed->setValue(spot.sigmaed); @@ -3525,6 +3530,7 @@ void LocallabContrast::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.sigmalc2 = sigmalc2->getValue(); spot.strwav = strwav->getValue(); spot.angwav = angwav->getValue(); + spot.featherwav = featherwav->getValue(); spot.wavedg = wavedg->get_active(); spot.strengthw = strengthw->getValue(); spot.sigmaed = sigmaed->getValue(); @@ -3627,6 +3633,7 @@ void LocallabContrast::setDefaults(const rtengine::procparams::ProcParams* defPa sigmalc2->setDefault(defSpot.sigmalc2); strwav->setDefault(defSpot.strwav); angwav->setDefault(defSpot.angwav); + featherwav->setDefault(defSpot.featherwav); strengthw->setDefault(defSpot.strengthw); sigmaed->setDefault(defSpot.sigmaed); gradw->setDefault(defSpot.gradw); @@ -3825,6 +3832,13 @@ void LocallabContrast::adjusterChanged(Adjuster* a, double newval) } } + if (a == featherwav) { + if (listener) { + listener->panelChanged(Evlocallabfeatherwav, + featherwav->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == strengthw) { if (listener) { listener->panelChanged(Evlocallabstrengthw, @@ -4146,6 +4160,7 @@ void LocallabContrast::convertParamToNormal() sigmalc2->setValue(defSpot.sigmalc2); strwav->setValue(defSpot.strwav); angwav->setValue(defSpot.angwav); + featherwav->setValue(defSpot.featherwav); wavedg->set_active(defSpot.wavedg); strengthw->setValue(defSpot.strengthw); sigmaed->setValue(defSpot.sigmaed); @@ -5516,6 +5531,7 @@ LocallabLog::LocallabLog(): gradlogFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRADLOGFRA")))), strlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2.0, 2.0, 0.05, 0.))), anglog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + featherlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), expmaskL(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWC")))), showmaskLMethod(Gtk::manage(new MyComboBoxText())), enaLMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), @@ -5539,6 +5555,7 @@ LocallabLog::LocallabLog(): Evlocallabcomprlog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_LOG_COMPR"); Evlocallabstrelog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_LOG_STRE"); Evlocallabsatlog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_LOG_SAT"); + Evlocallabfeatherlog = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERLOG"); set_orientation(Gtk::ORIENTATION_VERTICAL); @@ -5619,6 +5636,7 @@ LocallabLog::LocallabLog(): strlog->setAdjusterListener(this); anglog->setAdjusterListener(this); + featherlog->setAdjusterListener(this); surHBox->set_spacing(2); surHBox->set_tooltip_markup(M("TP_LOCALLAB_LOGSURSOUR_TOOLTIP")); @@ -5788,6 +5806,7 @@ LocallabLog::LocallabLog(): ToolParamBlock* const gradlogBox = Gtk::manage(new ToolParamBlock()); gradlogBox->pack_start(*strlog); gradlogBox->pack_start(*anglog); + gradlogBox->pack_start(*featherlog); gradlogFrame->add(*gradlogBox); pack_start(*gradlogFrame); } @@ -6101,6 +6120,7 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE sensilog->setValue((double)spot.sensilog); strlog->setValue(spot.strlog); anglog->setValue(spot.anglog); + featherlog->setValue(spot.featherlog); CCmaskshapeL->setCurve(spot.CCmaskcurveL); LLmaskshapeL->setCurve(spot.LLmaskcurveL); HHmaskshapeL->setCurve(spot.HHmaskcurveL); @@ -6168,6 +6188,7 @@ void LocallabLog::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.sensilog = sensilog->getIntValue(); spot.strlog = strlog->getValue(); spot.anglog = anglog->getValue(); + spot.featherlog = featherlog->getValue(); spot.CCmaskcurveL = CCmaskshapeL->getCurve(); spot.LLmaskcurveL = LLmaskshapeL->getCurve(); spot.HHmaskcurveL = HHmaskshapeL->getCurve(); @@ -6354,6 +6375,7 @@ void LocallabLog::convertParamToSimple() sursour->set_active(0); strlog->setValue(defSpot.strlog); anglog->setValue(defSpot.anglog); + featherlog->setValue(defSpot.featherlog); enaLMask->set_active(false); showmaskLMethod->set_active(0); recothresl->setValue(defSpot.recothresl); @@ -6476,6 +6498,7 @@ void LocallabLog::setDefaults(const rtengine::procparams::ProcParams* defParams, sensilog->setDefault((double)defSpot.sensilog); strlog->setDefault(defSpot.strlog); anglog->setDefault(defSpot.anglog); + featherlog->setDefault(defSpot.featherlog); blendmaskL->setDefault(defSpot.blendmaskL); radmaskL->setDefault(defSpot.radmaskL); chromaskL->setDefault(defSpot.chromaskL); @@ -6699,6 +6722,13 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } } + if (a == featherlog) { + if (listener) { + listener->panelChanged(Evlocallabfeatherlog, + featherlog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == blendmaskL) { if (listener) { listener->panelChanged(EvLocallabblendmaskL, @@ -7011,11 +7041,13 @@ LocallabMask::LocallabMask(): csThresholdmask(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 0, 9, 0, 0, 6, 5, 0, false))), gradFramemask(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRADFRA")))), str_mask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2., 2., 0.05, 0.))), + feather_mask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), ang_mask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180., 180., 0.1, 0.))) { auto m = ProcEventMapper::getInstance(); Evlocallabpreviewmas = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_PREVIEWMAS"); + Evlocallabfeather_mask = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERMAS"); set_orientation(Gtk::ORIENTATION_VERTICAL); @@ -7125,6 +7157,7 @@ LocallabMask::LocallabMask(): ang_mask->setAdjusterListener(this); ang_mask->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + feather_mask->setAdjusterListener(this); // Add Common mask specific widgets to GUI pack_start(*sensimask); @@ -7160,6 +7193,7 @@ LocallabMask::LocallabMask(): ToolParamBlock* const gradmaskBox = Gtk::manage(new ToolParamBlock()); gradmaskBox->pack_start(*str_mask); gradmaskBox->pack_start(*ang_mask); + gradmaskBox->pack_start(*feather_mask); gradFramemask->add(*gradmaskBox); toolmaskBox->pack_start(*gradFramemask, Gtk::PACK_SHRINK, 0); toolmaskFrame->add(*toolmaskBox); @@ -7375,6 +7409,7 @@ void LocallabMask::read(const rtengine::procparams::ProcParams* pp, const Params csThresholdmask->setValue(spot.csthresholdmask); str_mask->setValue((double)spot.str_mask); ang_mask->setValue((double)spot.ang_mask); + feather_mask->setValue((double)spot.feather_mask); } // Enable all listeners @@ -7422,6 +7457,7 @@ void LocallabMask::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped spot.csthresholdmask = csThresholdmask->getValue(); spot.str_mask = str_mask->getIntValue(); spot.ang_mask = ang_mask->getIntValue(); + spot.feather_mask = feather_mask->getIntValue(); } // Note: No need to manage pedited as batch mode is deactivated for Locallab @@ -7451,6 +7487,7 @@ void LocallabMask::setDefaults(const rtengine::procparams::ProcParams* defParams csThresholdmask->setDefault(defSpot.csthresholdmask); str_mask->setDefault((double)defSpot.str_mask); ang_mask->setDefault((double)defSpot.ang_mask); + feather_mask->setDefault((double)defSpot.feather_mask); } // Note: No need to manage pedited as batch mode is deactivated for Locallab @@ -7565,6 +7602,13 @@ void LocallabMask::adjusterChanged(Adjuster* a, double newval) } } + if (a == feather_mask) { + if (listener) { + listener->panelChanged(Evlocallabfeather_mask, + feather_mask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } } @@ -7700,6 +7744,7 @@ void LocallabMask::convertParamToNormal() csThresholdmask->setValue(defSpot.csthresholdmask); str_mask->setValue((double)defSpot.str_mask); ang_mask->setValue((double)defSpot.ang_mask); + feather_mask->setValue((double)defSpot.feather_mask); // Enable all listeners enableListener(); @@ -8067,6 +8112,7 @@ Locallabcie::Locallabcie(): expgradcie(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), strgradcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4., 4., 0.05, 0.))), anggradcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + feathercie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), exprecovcie(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), maskusablecie(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), @@ -8167,6 +8213,7 @@ Locallabcie::Locallabcie(): Evlocallabdetailciejz = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_DETAILJZ"); EvlocallabenacieMaskall = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_ENAMASKALL"); Evlocallabsmoothciemet = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_CIE_SMOOTHMET"); + Evlocallabfeathercie = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_FEATHERCIE"); set_orientation(Gtk::ORIENTATION_VERTICAL); @@ -8984,9 +9031,11 @@ Locallabcie::Locallabcie(): strgradcie->setAdjusterListener(this); anggradcie->setAdjusterListener(this); + feathercie->setAdjusterListener(this); ToolParamBlock* const cieBoxgrad = Gtk::manage(new ToolParamBlock()); cieBoxgrad->pack_start(*strgradcie); cieBoxgrad->pack_start(*anggradcie); + cieBoxgrad->pack_start(*feathercie); expgradcie->add(*cieBoxgrad, false); pack_start(*expgradcie, false, false); @@ -9875,6 +9924,7 @@ void Locallabcie::read(const rtengine::procparams::ProcParams* pp, const ParamsE strgradcie->setValue((double)spot.strgradcie); anggradcie->setValue((double)spot.anggradcie); + feathercie->setValue((double)spot.feathercie); enacieMask->set_active(spot.enacieMask); enacieMaskall->set_active(spot.enacieMaskall); @@ -10178,6 +10228,7 @@ void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.detailcie = detailcie->getValue(); spot.strgradcie = strgradcie->getValue(); spot.anggradcie = anggradcie->getValue(); + spot.feathercie = feathercie->getValue(); spot.enacieMask = enacieMask->get_active(); spot.enacieMaskall = enacieMaskall->get_active(); @@ -11886,6 +11937,7 @@ void Locallabcie::convertParamToSimple() enacieMaskall->set_active(defSpot.enacieMaskall); strgradcie->setValue(defSpot.strgradcie); anggradcie->setValue(defSpot.anggradcie); + feathercie->setValue(defSpot.feathercie); refi->setValue(defSpot.refi); modecie->set_active(0); primMethod->set_active(0);//Prophoto @@ -12050,6 +12102,7 @@ void Locallabcie::setDefaults(const rtengine::procparams::ProcParams* defParams, // detailcie->setDefault(defSpot.detailcie); strgradcie->setDefault((double)defSpot.strgradcie); anggradcie->setDefault((double)defSpot.anggradcie); + feathercie->setDefault((double)defSpot.feathercie); blendmaskcie->setDefault((double)defSpot.blendmaskcie); radmaskcie->setDefault(defSpot.radmaskcie); chromaskcie->setDefault(defSpot.chromaskcie); @@ -12758,6 +12811,13 @@ void Locallabcie::adjusterChanged(Adjuster* a, double newval) } } + if (a == feathercie) { + if (listener) { + listener->panelChanged(Evlocallabfeathercie, + feathercie->getTextValue() + spName); + } + } + if (a == blendmaskcie) { if (listener) { listener->panelChanged(Evlocallabblendmaskcie, diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 66ea3f9aa..81b6b34d8 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1185,6 +1185,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).strcolab = locallab.spots.at(j).strcolab && pSpot.strcolab == otherSpot.strcolab; locallab.spots.at(j).strcolh = locallab.spots.at(j).strcolh && pSpot.strcolh == otherSpot.strcolh; locallab.spots.at(j).angcol = locallab.spots.at(j).angcol && pSpot.angcol == otherSpot.angcol; + locallab.spots.at(j).feathercol = locallab.spots.at(j).feathercol && pSpot.feathercol == otherSpot.feathercol; locallab.spots.at(j).blurcolde = locallab.spots.at(j).blurcolde && pSpot.blurcolde == otherSpot.blurcolde; locallab.spots.at(j).blurcol = locallab.spots.at(j).blurcol && pSpot.blurcol == otherSpot.blurcol; locallab.spots.at(j).contcol = locallab.spots.at(j).contcol && pSpot.contcol == otherSpot.contcol; @@ -1247,6 +1248,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).blurexpde = locallab.spots.at(j).blurexpde && pSpot.blurexpde == otherSpot.blurexpde; locallab.spots.at(j).strexp = locallab.spots.at(j).strexp && pSpot.strexp == otherSpot.strexp; locallab.spots.at(j).angexp = locallab.spots.at(j).angexp && pSpot.angexp == otherSpot.angexp; + locallab.spots.at(j).featherexp = locallab.spots.at(j).featherexp && pSpot.featherexp == otherSpot.featherexp; locallab.spots.at(j).excurve = locallab.spots.at(j).excurve && pSpot.excurve == otherSpot.excurve; locallab.spots.at(j).norm = locallab.spots.at(j).norm && pSpot.norm == otherSpot.norm; locallab.spots.at(j).inversex = locallab.spots.at(j).inversex && pSpot.inversex == otherSpot.inversex; @@ -1306,6 +1308,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).blurSHde = locallab.spots.at(j).blurSHde && pSpot.blurSHde == otherSpot.blurSHde; locallab.spots.at(j).strSH = locallab.spots.at(j).strSH && pSpot.strSH == otherSpot.strSH; locallab.spots.at(j).angSH = locallab.spots.at(j).angSH && pSpot.angSH == otherSpot.angSH; + locallab.spots.at(j).featherSH = locallab.spots.at(j).featherSH && pSpot.featherSH == otherSpot.featherSH; locallab.spots.at(j).inverssh = locallab.spots.at(j).inverssh && pSpot.inverssh == otherSpot.inverssh; locallab.spots.at(j).chromaskSH = locallab.spots.at(j).chromaskSH && pSpot.chromaskSH == otherSpot.chromaskSH; locallab.spots.at(j).gammaskSH = locallab.spots.at(j).gammaskSH && pSpot.gammaskSH == otherSpot.gammaskSH; @@ -1351,6 +1354,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).strvibab = locallab.spots.at(j).strvibab && pSpot.strvibab == otherSpot.strvibab; locallab.spots.at(j).strvibh = locallab.spots.at(j).strvibh && pSpot.strvibh == otherSpot.strvibh; locallab.spots.at(j).angvib = locallab.spots.at(j).angvib && pSpot.angvib == otherSpot.angvib; + locallab.spots.at(j).feathervib = locallab.spots.at(j).feathervib && pSpot.feathervib == otherSpot.feathervib; locallab.spots.at(j).Lmaskvibcurve = locallab.spots.at(j).Lmaskvibcurve && pSpot.Lmaskvibcurve == otherSpot.Lmaskvibcurve; locallab.spots.at(j).recothresv = locallab.spots.at(j).recothresv && pSpot.recothresv == otherSpot.recothresv; locallab.spots.at(j).lowthresv = locallab.spots.at(j).lowthresv && pSpot.lowthresv == otherSpot.lowthresv; @@ -1567,6 +1571,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).sigmalc2 = locallab.spots.at(j).sigmalc2 && pSpot.sigmalc2 == otherSpot.sigmalc2; locallab.spots.at(j).strwav = locallab.spots.at(j).strwav && pSpot.strwav == otherSpot.strwav; locallab.spots.at(j).angwav = locallab.spots.at(j).angwav && pSpot.angwav == otherSpot.angwav; + locallab.spots.at(j).featherwav = locallab.spots.at(j).featherwav && pSpot.featherwav == otherSpot.featherwav; locallab.spots.at(j).strengthw = locallab.spots.at(j).strengthw && pSpot.strengthw == otherSpot.strengthw; locallab.spots.at(j).sigmaed = locallab.spots.at(j).sigmaed && pSpot.sigmaed == otherSpot.sigmaed; locallab.spots.at(j).radiusw = locallab.spots.at(j).radiusw && pSpot.radiusw == otherSpot.radiusw; @@ -1678,6 +1683,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).baselog = locallab.spots.at(j).baselog && pSpot.baselog == otherSpot.baselog; locallab.spots.at(j).strlog = locallab.spots.at(j).strlog && pSpot.strlog == otherSpot.strlog; locallab.spots.at(j).anglog = locallab.spots.at(j).anglog && pSpot.anglog == otherSpot.anglog; + locallab.spots.at(j).featherlog = locallab.spots.at(j).featherlog && pSpot.featherlog == otherSpot.featherlog; locallab.spots.at(j).CCmaskcurveL = locallab.spots.at(j).CCmaskcurveL && pSpot.CCmaskcurveL == otherSpot.CCmaskcurveL; locallab.spots.at(j).LLmaskcurveL = locallab.spots.at(j).LLmaskcurveL && pSpot.LLmaskcurveL == otherSpot.LLmaskcurveL; locallab.spots.at(j).HHmaskcurveL = locallab.spots.at(j).HHmaskcurveL && pSpot.HHmaskcurveL == otherSpot.HHmaskcurveL; @@ -1716,6 +1722,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).shadmask = locallab.spots.at(j).shadmask && pSpot.shadmask == otherSpot.shadmask; locallab.spots.at(j).str_mask = locallab.spots.at(j).str_mask && pSpot.str_mask == otherSpot.str_mask; locallab.spots.at(j).ang_mask = locallab.spots.at(j).ang_mask && pSpot.ang_mask == otherSpot.ang_mask; + locallab.spots.at(j).feather_mask = locallab.spots.at(j).feather_mask && pSpot.feather_mask == otherSpot.feather_mask; locallab.spots.at(j).HHhmask_curve = locallab.spots.at(j).HHhmask_curve && pSpot.HHhmask_curve == otherSpot.HHhmask_curve; locallab.spots.at(j).Lmask_curve = locallab.spots.at(j).Lmask_curve && pSpot.Lmask_curve == otherSpot.Lmask_curve; locallab.spots.at(j).LLmask_curvewav = locallab.spots.at(j).LLmask_curvewav && pSpot.LLmask_curvewav == otherSpot.LLmask_curvewav; @@ -1848,7 +1855,8 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).strgradcie = locallab.spots.at(j).strgradcie && pSpot.strgradcie == otherSpot.strgradcie; locallab.spots.at(j).anggradcie = locallab.spots.at(j).anggradcie && pSpot.anggradcie == otherSpot.anggradcie; - + locallab.spots.at(j).feathercie = locallab.spots.at(j).feathercie && pSpot.feathercie == otherSpot.feathercie; + locallab.spots.at(j).enacieMask = locallab.spots.at(j).enacieMask && pSpot.enacieMask == otherSpot.enacieMask; locallab.spots.at(j).enacieMaskall = locallab.spots.at(j).enacieMaskall && pSpot.enacieMaskall == otherSpot.enacieMaskall; locallab.spots.at(j).CCmaskciecurve = locallab.spots.at(j).CCmaskciecurve && pSpot.CCmaskciecurve == otherSpot.CCmaskciecurve; @@ -3832,6 +3840,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angcol = mods.locallab.spots.at(i).angcol; } + if (locallab.spots.at(i).feathercol) { + toEdit.locallab.spots.at(i).feathercol = mods.locallab.spots.at(i).feathercol; + } + if (locallab.spots.at(i).blurcolde) { toEdit.locallab.spots.at(i).blurcolde = mods.locallab.spots.at(i).blurcolde; } @@ -4081,6 +4093,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angexp = mods.locallab.spots.at(i).angexp; } + if (locallab.spots.at(i).featherexp) { + toEdit.locallab.spots.at(i).featherexp = mods.locallab.spots.at(i).featherexp; + } + if (locallab.spots.at(i).excurve) { toEdit.locallab.spots.at(i).excurve = mods.locallab.spots.at(i).excurve; } @@ -4300,6 +4316,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angSH = mods.locallab.spots.at(i).angSH; } + if (locallab.spots.at(i).featherSH) { + toEdit.locallab.spots.at(i).featherSH = mods.locallab.spots.at(i).featherSH; + } + if (locallab.spots.at(i).inverssh) { toEdit.locallab.spots.at(i).inverssh = mods.locallab.spots.at(i).inverssh; } @@ -4477,6 +4497,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angvib = mods.locallab.spots.at(i).angvib; } + if (locallab.spots.at(i).feathervib) { + toEdit.locallab.spots.at(i).feathervib = mods.locallab.spots.at(i).feathervib; + } + if (locallab.spots.at(i).Lmaskvibcurve) { toEdit.locallab.spots.at(i).Lmaskvibcurve = mods.locallab.spots.at(i).Lmaskvibcurve; } @@ -5325,6 +5349,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).angwav = mods.locallab.spots.at(i).angwav; } + if (locallab.spots.at(i).featherwav) { + toEdit.locallab.spots.at(i).featherwav = mods.locallab.spots.at(i).featherwav; + } + if (locallab.spots.at(i).strengthw) { toEdit.locallab.spots.at(i).strengthw = mods.locallab.spots.at(i).strengthw; } @@ -5749,6 +5777,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).anglog = mods.locallab.spots.at(i).anglog; } + if (locallab.spots.at(i).featherlog) { + toEdit.locallab.spots.at(i).featherlog = mods.locallab.spots.at(i).featherlog; + } + if (locallab.spots.at(i).CCmaskcurveL) { toEdit.locallab.spots.at(i).CCmaskcurveL = mods.locallab.spots.at(i).CCmaskcurveL; } @@ -5890,6 +5922,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).ang_mask = mods.locallab.spots.at(i).ang_mask; } + if (locallab.spots.at(i).feather_mask) { + toEdit.locallab.spots.at(i).feather_mask = mods.locallab.spots.at(i).feather_mask; + } + if (locallab.spots.at(i).HHhmask_curve) { toEdit.locallab.spots.at(i).HHhmask_curve = mods.locallab.spots.at(i).HHhmask_curve; } @@ -6423,6 +6459,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).anggradcie = mods.locallab.spots.at(i).anggradcie; } + if (locallab.spots.at(i).feathercie) { + toEdit.locallab.spots.at(i).feathercie = mods.locallab.spots.at(i).feathercie; + } + if (locallab.spots.at(i).enacieMask) { toEdit.locallab.spots.at(i).enacieMask = mods.locallab.spots.at(i).enacieMask; } @@ -7938,6 +7978,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : strcolab(v), strcolh(v), angcol(v), + feathercol(v), blurcolde(v), blurcol(v), contcol(v), @@ -8000,6 +8041,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : blurexpde(v), strexp(v), angexp(v), + featherexp(v), excurve(v), norm(v), inversex(v), @@ -8055,6 +8097,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : blurSHde(v), strSH(v), angSH(v), + featherSH(v), inverssh(v), chromaskSH(v), gammaskSH(v), @@ -8100,6 +8143,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : strvibab(v), strvibh(v), angvib(v), + feathervib(v), Lmaskvibcurve(v), recothresv(v), lowthresv(v), @@ -8316,6 +8360,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : sigmalc2(v), strwav(v), angwav(v), + featherwav(v), strengthw(v), sigmaed(v), radiusw(v), @@ -8422,6 +8467,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : baselog(v), strlog(v), anglog(v), + featherlog(v), CCmaskcurveL(v), LLmaskcurveL(v), HHmaskcurveL(v), @@ -8459,6 +8505,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : shadmask(v), str_mask(v), ang_mask(v), + feather_mask(v), HHhmask_curve(v), Lmask_curve(v), LLmask_curvewav(v), @@ -8588,6 +8635,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : surroundcie(v), strgradcie(v), anggradcie(v), + feathercie(v), enacieMask(v), enacieMaskall(v), CCmaskciecurve(v), @@ -8690,6 +8738,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) strcolab = v; strcolh = v; angcol = v; + feathercol = v; blurcolde = v; blurcol = v; contcol = v; @@ -8752,6 +8801,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) blurexpde = v; strexp = v; angexp = v; + featherexp = v; excurve = v; norm = v; inversex = v; @@ -8811,6 +8861,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) blurSHde = v; strSH = v; angSH = v; + featherSH = v; inverssh = v; chromaskSH = v; gammaskSH = v; @@ -8856,6 +8907,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) strvibab = v; strvibh = v; angvib = v; + feathervib = v; Lmaskvibcurve = v; recothresv = v; lowthresv = v; @@ -9071,6 +9123,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) sigmalc2 = v; strwav = v; angwav = v; + featherwav = v; strengthw = v; sigmaed = v; radiusw = v; @@ -9181,6 +9234,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) baselog = v; strlog = v; anglog = v; + featherlog = v; CCmaskcurveL = v; LLmaskcurveL = v; HHmaskcurveL = v; @@ -9218,6 +9272,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) shadmask = v; str_mask = v; ang_mask = v; + feather_mask = v; HHhmask_curve = v; Lmask_curve = v; LLmask_curvewav = v; @@ -9346,6 +9401,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) detailcie = v; surroundcie = v; anggradcie = v; + feathercie = v; strgradcie = v; enacieMask = v; enacieMaskall = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 27f9ac9cc..bc617612c 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -476,6 +476,7 @@ public: bool strcolab; bool strcolh; bool angcol; + bool feathercol; bool blurcolde; bool blurcol; bool contcol; @@ -538,6 +539,7 @@ public: bool blurexpde; bool strexp; bool angexp; + bool featherexp; bool excurve; bool norm; bool inversex; @@ -593,6 +595,7 @@ public: bool blurSHde; bool strSH; bool angSH; + bool featherSH; bool inverssh; bool chromaskSH; bool gammaskSH; @@ -638,6 +641,7 @@ public: bool strvibab; bool strvibh; bool angvib; + bool feathervib; bool Lmaskvibcurve; bool recothresv; bool lowthresv; @@ -854,6 +858,7 @@ public: bool sigmalc2; bool strwav; bool angwav; + bool featherwav; bool strengthw; bool sigmaed; bool radiusw; @@ -960,6 +965,7 @@ public: bool baselog; bool strlog; bool anglog; + bool featherlog; bool CCmaskcurveL; bool LLmaskcurveL; bool HHmaskcurveL; @@ -997,6 +1003,7 @@ public: bool shadmask; bool str_mask; bool ang_mask; + bool feather_mask; bool HHhmask_curve; bool Lmask_curve; bool LLmask_curvewav; @@ -1127,6 +1134,7 @@ public: bool surroundcie; bool strgradcie; bool anggradcie; + bool feathercie; bool enacieMask; bool enacieMaskall; From c478c7caa32cbb0b2ec9b8d65e588d4d91123b8b Mon Sep 17 00:00:00 2001 From: Lawrence37 <45837045+Lawrence37@users.noreply.github.com> Date: Sun, 16 Jun 2024 10:47:04 -0700 Subject: [PATCH 50/78] Remove Itanium architecture support for Windows --- UpdateInfo.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index b0c2bdff6..350adc071 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -100,15 +100,15 @@ if(WIN32) if(BIT_DEPTH EQUAL 4) set(BUILD_BIT_DEPTH 32) # 32 bits builds has to be installable on 64 bits system, to support WinXP/64. - set(ARCHITECTURE_ALLOWED "x86 x64 ia64") + set(ARCHITECTURE_ALLOWED "x86 x64") # installing in 32 bits mode even on 64 bits OS and architecture set(INSTALL_MODE "") elseif(BIT_DEPTH EQUAL 8) set(BUILD_BIT_DEPTH 64) # Restricting the 64 bits builds to 64 bits systems only - set(ARCHITECTURE_ALLOWED "x64 ia64 arm64") + set(ARCHITECTURE_ALLOWED "x64 arm64") # installing in 64 bits mode for all 64 bits processors, even for itanium architecture - set(INSTALL_MODE "x64 ia64 arm64") + set(INSTALL_MODE "x64 arm64") endif() # set part of the output archive name set(SYSTEM_NAME "WinVista") From 3433741bb6df4849003def58503411f0f0d5e9ff Mon Sep 17 00:00:00 2001 From: Lawrence37 <45837045+Lawrence37@users.noreply.github.com> Date: Sun, 16 Jun 2024 15:33:46 -0700 Subject: [PATCH 51/78] Mention capture sharpening in contrast mask tool-tip Closes #7087. --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index f8f7cf114..5ef480ce4 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1793,7 +1793,7 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r -MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. +MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%, or when capture sharpening is enabled. MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l From 89de9792480b239fe7b5f5bbb584019c0ce7e1c9 Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Sun, 16 Jun 2024 16:41:55 -0700 Subject: [PATCH 52/78] Add Nikon Z f color matrix --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index b80d776b8..00fc2cf5d 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -2101,6 +2101,11 @@ Camera constants: "pdaf_pattern": [285, 297, 309, 321, 333, 345, 357, 369, 381, 393, 405, 417, 429, 441, 453, 465, 477, 489, 501, 513, 525, 537, 549, 561, 573, 585, 597, 609, 621, 633, 645, 657, 669, 681, 693, 705, 717, 729, 741, 753, 765, 777, 789, 801, 813, 825, 837, 849, 861, 873, 885, 897, 909, 921, 933, 945, 957, 969, 981, 993, 1005, 1017, 1029, 1041, 1053, 1065, 1077, 1089, 1101, 1113, 1125, 1137, 1149, 1161, 1173, 1185, 1197, 1209, 1221, 1233, 1245, 1257, 1269, 1281, 1293, 1305, 1317, 1329, 1341, 1353, 1365, 1377, 1389, 1401, 1413, 1425, 1437, 1449, 1461, 1473, 1485, 1497, 1509, 1521, 1533, 1545, 1557, 1569, 1581, 1593, 1605, 1617, 1629, 1641, 1653, 1665, 1677, 1689, 1701, 1713, 1725, 1737, 1749, 1761, 1773, 1785, 1797, 1809, 1821, 1833, 1845, 1857, 1869, 1881, 1893, 1905, 1917, 1929, 1941, 1953, 1965, 1977, 1989, 2001, 2013, 2025, 2037, 2049, 2061, 2073, 2085, 2097, 2109, 2121, 2133, 2145, 2157, 2169, 2181, 2193, 2205, 2217, 2229, 2241, 2253, 2265, 2277, 2289, 2301, 2313, 2325, 2337, 2349, 2361, 2373, 2385, 2397, 2409, 2421, 2433, 2445, 2457, 2469, 2481, 2493, 2505, 2517, 2529, 2541, 2553, 2565, 2577, 2589, 2601, 2613, 2625, 2637, 2649, 2661, 2673, 2685, 2697, 2709, 2721, 2733, 2745, 2757, 2769, 2781, 2793, 2805, 2817, 2829, 2841, 2853, 2865, 2877, 2889, 2901, 2913, 2925, 2937, 2949, 2961, 2973, 2985, 2997, 3009, 3021, 3033, 3045, 3057, 3069, 3081, 3093, 3105, 3117, 3129, 3141, 3153, 3165, 3177, 3189, 3201, 3213, 3225, 3237, 3249, 3261, 3273, 3285, 3297, 3309, 3321, 3333, 3345, 3357, 3369, 3381, 3393, 3405, 3417, 3429, 3441] }, + { // Quality C + "make_model" : "Nikon Z f", + "dcraw_matrix" : [ 11607, -4491, -977, -4522, 12460, 2304, -458, 1519, 7616 ] // DNG v16.1 + }, + { // Quality B, 16Mp and 64Mp raw frames "make_model": "OLYMPUS E-M5MarkII", "dcraw_matrix": [ 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 ], // DNG_v8.8 D65 From cffba6c3b065a3d537107875d98ab527484d014d Mon Sep 17 00:00:00 2001 From: xiota Date: Mon, 17 Jun 2024 02:15:19 +0000 Subject: [PATCH 53/78] Move add-extension panel to top of frame --- rtgui/preferences.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 97bfb92b6..54e0c6725 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -1552,9 +1552,9 @@ Gtk::Widget* Preferences::getFileBrowserPanel() frmnu->add (*menuGrid); - Gtk::Frame* fre = Gtk::manage(new Gtk::Frame(M("PREFERENCES_PARSEDEXT"))); Gtk::Box* vbre = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* hb0 = Gtk::manage(new Gtk::Box()); Gtk::Label* elab = Gtk::manage (new Gtk::Label (M("PREFERENCES_PARSEDEXTADD") + ":", Gtk::ALIGN_START)); hb0->pack_start(*elab, Gtk::PACK_SHRINK, 4); @@ -1582,6 +1582,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel() hb0->pack_end(*moveExtUp, Gtk::PACK_SHRINK, 4); hb0->pack_end(*delExt, Gtk::PACK_SHRINK, 4); hb0->pack_end(*addExt, Gtk::PACK_SHRINK, 4); + extensions = Gtk::manage(new Gtk::TreeView()); Gtk::ScrolledWindow* hscrollw = Gtk::manage(new Gtk::ScrolledWindow()); hscrollw->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); @@ -1591,8 +1592,9 @@ Gtk::Widget* Preferences::getFileBrowserPanel() extensions->append_column_editable("Enabled", extensionColumns.enabled); extensions->append_column("Extension", extensionColumns.ext); extensions->set_headers_visible(false); - vbre->pack_start(*hscrollw); + vbre->pack_start(*hb0, Gtk::PACK_SHRINK, 4); + vbre->pack_start(*hscrollw); fre->add(*vbre); @@ -2679,7 +2681,7 @@ void Preferences::addExtPressed() } } - Gtk::TreeRow row = * (extensionModel->append()); + Gtk::TreeRow row = * (extensionModel->prepend()); row[extensionColumns.enabled] = true; row[extensionColumns.ext] = extension->get_text(); From 6eb191c5e5e55044c357a0c27869c7bf2c744277 Mon Sep 17 00:00:00 2001 From: xiota Date: Mon, 17 Jun 2024 01:25:06 +0000 Subject: [PATCH 54/78] Disable addExt/delExt buttons based on context --- rtgui/preferences.cc | 81 +++++++++++++++++++++++++++++--------------- rtgui/preferences.h | 2 ++ 2 files changed, 56 insertions(+), 27 deletions(-) diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 54e0c6725..94dc68e65 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -1566,8 +1566,10 @@ Gtk::Widget* Preferences::getFileBrowserPanel() delExt = Gtk::manage(new Gtk::Button()); moveExtUp = Gtk::manage(new Gtk::Button()); moveExtDown = Gtk::manage(new Gtk::Button()); - addExt->set_tooltip_text(M("PREFERENCES_PARSEDEXTADDHINT")); - delExt->set_tooltip_text(M("PREFERENCES_PARSEDEXTDELHINT")); + addExt->set_sensitive(false); + delExt->set_sensitive(false); + addExt->set_tooltip_markup(M("PREFERENCES_PARSEDEXTADDHINT")); + delExt->set_tooltip_markup(M("PREFERENCES_PARSEDEXTDELHINT")); moveExtUp->set_tooltip_text(M("PREFERENCES_PARSEDEXTUPHINT")); moveExtDown->set_tooltip_text(M("PREFERENCES_PARSEDEXTDOWNHINT")); Gtk::Image* addExtImg = Gtk::manage ( new RTImage ("add-small", Gtk::ICON_SIZE_BUTTON) ); @@ -1672,11 +1674,14 @@ Gtk::Widget* Preferences::getFileBrowserPanel() vbFileBrowser->pack_start (*hb6, Gtk::PACK_SHRINK, 4); + extensions->signal_cursor_changed().connect(sigc::mem_fun(*this, &Preferences::extensionsChanged)); + extension->signal_changed().connect(sigc::mem_fun(*this, &Preferences::extensionChanged)); + addExt->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::addExtPressed)); delExt->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::delExtPressed)); moveExtUp->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::moveExtUpPressed)); moveExtDown->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::moveExtDownPressed)); - extension->signal_activate().connect(sigc::mem_fun(*this, &Preferences::addExtPressed)); + clearThumbsBtn->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearThumbImagesPressed) ); if (moptions.saveParamsCache) { clearProfilesBtn->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::clearProfilesPressed)); @@ -2670,9 +2675,50 @@ void Preferences::workflowUpdate() } } +void Preferences::extensionsChanged() +{ + const Glib::RefPtr selection = extensions->get_selection(); + if (!selection) { + delExt->set_sensitive(false); + return; + } + + const Gtk::TreeModel::iterator selected = selection->get_selected(); + if (!selected) { + delExt->set_sensitive(false); + return; + } + + bool delOkay = true; + for (auto const &x : moptions.knownExtensions) { + if (x == (*selected)[extensionColumns.ext]) { + delOkay = false; + break; + } + } + delExt->set_sensitive(delOkay); +} + +void Preferences::extensionChanged() +{ + if (extension->get_text()[0] == '\0') { + addExt->set_sensitive(false); + return; + } + + Gtk::TreeNodeChildren c = extensionModel->children(); + for (size_t i = 0; i < c.size(); i++) { + if (c[i][extensionColumns.ext] == extension->get_text()) { + addExt->set_sensitive(false); + return; + } + } + + addExt->set_sensitive(true); +} + void Preferences::addExtPressed() { - Gtk::TreeNodeChildren c = extensionModel->children(); for (size_t i = 0; i < c.size(); i++) { @@ -2685,33 +2731,14 @@ void Preferences::addExtPressed() row[extensionColumns.enabled] = true; row[extensionColumns.ext] = extension->get_text(); + + extension->set_text(""); + addExt->set_sensitive(false); } void Preferences::delExtPressed() { - const Glib::RefPtr selection = extensions->get_selection(); - - if (!selection) { - return; - } - - const Gtk::TreeModel::iterator selected = selection->get_selected(); - - if (!selected) { - return; - } - - bool delOkay = true; - for (auto const &x : moptions.knownExtensions) { - if (x == (*selected)[extensionColumns.ext]) { - delOkay = false; - break; - } - } - - if (delOkay) { - extensionModel->erase(selected); - } + extensionModel->erase(extensions->get_selection()->get_selected()); } void Preferences::moveExtUpPressed() diff --git a/rtgui/preferences.h b/rtgui/preferences.h index e01ec85c0..b98a8a306 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -323,6 +323,8 @@ public: void observer10Toggled (); void selectStartupDir (); + void extensionsChanged (); + void extensionChanged (); void addExtPressed (); void delExtPressed (); void moveExtUpPressed (); From 51277dc7d2521a306ae4314cc3e1dc0deedb315e Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Sun, 23 Jun 2024 12:40:51 -0700 Subject: [PATCH 55/78] Move function into anonymous namespace --- rtengine/rawimagesource.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 03823644b..63969a21c 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -420,6 +420,16 @@ void transLineD1x(const float* const red, const float* const green, const float* } } +bool checkRawDataDimensions(const array2D &rawData, const rtengine::RawImage &rawImage, int width, int height) +{ + const int colors = (rawImage.getSensorType() == rtengine::ST_BAYER || + rawImage.getSensorType() == rtengine::ST_FUJI_XTRANS || + rawImage.get_colors() == 1) + ? 1 + : 3; + return rawData.getHeight() == height && rawData.getWidth() == colors * width; +} + } @@ -742,16 +752,6 @@ void RawImageSource::getWBMults(const ColorTemp &ctemp, const RAWParams &raw, st autoGainComp = camInitialGain / initialGain; } -bool checkRawDataDimensions(const array2D &rawData, const RawImage &rawImage, int width, int height) -{ - const int colors = (rawImage.getSensorType() == rtengine::ST_BAYER || - rawImage.getSensorType() == rtengine::ST_FUJI_XTRANS || - rawImage.get_colors() == 1) - ? 1 - : 3; - return rawData.getHeight() == height && rawData.getWidth() == colors * width; -} - void RawImageSource::getImage(const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw) { assert(checkRawDataDimensions(rawData, *ri, W, H)); From 082207eb6033c0c413b5f654998aab66d3d03b38 Mon Sep 17 00:00:00 2001 From: Richard E Barber Date: Tue, 25 Jun 2024 17:21:18 -0700 Subject: [PATCH 56/78] macOS CI: update libomp library to current --- .github/workflows/macos.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 3a0f27483..60bee53aa 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -25,7 +25,7 @@ jobs: mkdir build date +%s > build/stamp brew uninstall --ignore-dependencies libtiff - brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig llvm shared-mime-info exiv2 jpeg-xl | tee -a depslog + brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig llvm shared-mime-info exiv2 jpeg-xl libomp | tee -a depslog date -u echo "----====Pourage====----" cat depslog | grep Pouring @@ -69,7 +69,6 @@ jobs: -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ -DOSX_CONTINUOUS=ON \ .. - curl -L https://github.com/Homebrew/homebrew-core/raw/679923b4eb48a8dc7ecc1f05d06063cd79b3fc00/Formula/libomp.rb -o libomp.rb && brew install --formula libomp.rb zsh -c 'echo "Configured in $(printf "%0.2f" $(($[$(date +%s)-$(cat configstamp)]/$((60.))))) minutes"' - name: Compile RawTherapee run: | From 5a8f048e8aa94ad8c0b537347f92ad3147027bab Mon Sep 17 00:00:00 2001 From: Richard E Barber Date: Tue, 25 Jun 2024 17:25:53 -0700 Subject: [PATCH 57/78] mac: bundle libjxl_cms --- tools/osx/macosx_bundle.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index bd0dcf3e1..83689d45b 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -220,6 +220,9 @@ ModifyInstallNames 2>&1 # Copy libpng16 to the app bundle cp ${LOCAL_PREFIX}/lib/libpng16.16.dylib "${CONTENTS}/Frameworks/libpng16.16.dylib" +# Copy libjxl_cms to the app bundle +cp ${LOCAL_PREFIX}/lib/libjxl_cms.0.10.dylib "${CONTENTS}/Frameworks/libjxl_cms.0.10.dylib" + # Copy graphite to Frameworks cp ${LOCAL_PREFIX}/lib/libgraphite2.3.dylib "${CONTENTS}/Frameworks" From 893c4a153e56e251b614bab67b6dbe966772d106 Mon Sep 17 00:00:00 2001 From: Richard E Barber Date: Tue, 25 Jun 2024 18:00:40 -0700 Subject: [PATCH 58/78] macOS CI: point to new location of libomp --- .github/workflows/macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 60bee53aa..1188ae017 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -63,7 +63,7 @@ jobs: -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ -DOpenMP_C_LIB_NAMES=libomp \ -DOpenMP_CXX_LIB_NAMES=libomp \ - -DOpenMP_libomp_LIBRARY=/usr/local/lib/libomp.dylib \ + -DOpenMP_libomp_LIBRARY=/usr/local/opt/libomp/lib/libomp.dylib \ -DCMAKE_AR=/usr/bin/ar \ -DCMAKE_RANLIB=/usr/bin/ranlib \ -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ From df607d5e0418b769d43b0952c68b96ecdcdddbe5 Mon Sep 17 00:00:00 2001 From: Richard E Barber Date: Tue, 25 Jun 2024 18:07:07 -0700 Subject: [PATCH 59/78] macOS CI: point linker to opt/libomp --- .github/workflows/macos.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 1188ae017..307236fcf 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -35,7 +35,7 @@ jobs: CMAKE_CXX_STANDARD: 11 PKG_CONFIG_PATH: /usr/local/opt/libtiff/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig RAW_THERAPEE_MAJOR: '5' - RAW_THERAPEE_MINOR: '8' + RAW_THERAPEE_MINOR: '10' C_FLAGS: > -arch x86_64 -mtune=generic -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/libtiff/include run: | @@ -48,7 +48,7 @@ jobs: cmake \ -DCMAKE_BUILD_TYPE="Release" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCMAKE_EXE_LINKER_FLAGS="-L. -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/opt/gdk-pixbuf/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ + -DCMAKE_EXE_LINKER_FLAGS="-L. -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/opt/gdk-pixbuf/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libomp/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ -DPROC_TARGET_NUMBER="1" \ -DPROC_LABEL="generic processor" \ From 688f9696286c4e4a7c72deb64d6bda4c7af60e6f Mon Sep 17 00:00:00 2001 From: Richard E Barber Date: Tue, 25 Jun 2024 18:11:34 -0700 Subject: [PATCH 60/78] macOS CI: also point cflags to opt/libomp --- .github/workflows/macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 307236fcf..ef27c6dcb 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -37,7 +37,7 @@ jobs: RAW_THERAPEE_MAJOR: '5' RAW_THERAPEE_MINOR: '10' C_FLAGS: > - -arch x86_64 -mtune=generic -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/libtiff/include + -arch x86_64 -mtune=generic -Xpreprocessor -fopenmp /usr/local/opt/libomp/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/libtiff/include run: | # GITHUB_REF is the ref that triggered the build, like # refs/heads/new-feature - the next line parses that to REF: the branch From 1235cb202008630a41677ccaea0bb9f941e2b993 Mon Sep 17 00:00:00 2001 From: Richard E Barber Date: Tue, 25 Jun 2024 18:16:04 -0700 Subject: [PATCH 61/78] macOS CI: add include to cflags --- .github/workflows/macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index ef27c6dcb..fd2928a58 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -37,7 +37,7 @@ jobs: RAW_THERAPEE_MAJOR: '5' RAW_THERAPEE_MINOR: '10' C_FLAGS: > - -arch x86_64 -mtune=generic -Xpreprocessor -fopenmp /usr/local/opt/libomp/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/libtiff/include + -arch x86_64 -mtune=generic -Xpreprocessor -fopenmp /usr/local/opt/libomp/lib/libomp.dylib -I/usr/local/opt/libomp/include -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/libtiff/include run: | # GITHUB_REF is the ref that triggered the build, like # refs/heads/new-feature - the next line parses that to REF: the branch From b673154531bd3582f25cdb2fb5fd3b468f8d5324 Mon Sep 17 00:00:00 2001 From: Daniel Martinez Date: Tue, 17 May 2022 23:03:55 -0400 Subject: [PATCH 62/78] Support more ARQ files, 4 and 16 Shot ARQ from ILCE-1 --- rtengine/dcraw.cc | 7 ++++--- rtengine/pixelshift.cc | 36 ++++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 3358dc91b..7131eabf4 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -6590,9 +6590,10 @@ int CLASS parse_tiff_ifd (int base) break; case 258: /* BitsPerSample */ case 61443: - tiff_ifd[ifd].samples = len & 7; + if(!tiff_ifd[ifd].samples || tag != 258) + tiff_ifd[ifd].samples = len & 7; if ((tiff_ifd[ifd].bps = getint(type)) > 32) - tiff_ifd[ifd].bps = 8; + tiff_ifd[ifd].bps = 8; if (tiff_bps < tiff_ifd[ifd].bps) tiff_bps = tiff_ifd[ifd].bps; break; @@ -7288,7 +7289,7 @@ void CLASS apply_tiff() load_raw = &CLASS olympus_load_raw; // ------- RT ------- if (!strncmp(make,"SONY",4) && - (!strncmp(model,"ILCE-7RM3",9) || !strncmp(model,"ILCE-7RM4",9)) && + (!strncmp(model,"ILCE-7RM3",9) || !strncmp(model,"ILCE-7RM4",9) || !strncmp(model,"ILCE-1",6)) && tiff_samples == 4 && tiff_ifd[raw].bytes == raw_width*raw_height*tiff_samples*2) { load_raw = &CLASS sony_arq_load_raw; diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 8088e2e9c..2df07f074 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -592,6 +592,7 @@ BENCHFUN static const float ePerIsoILCE7RM3 = 0.8f; + //TODO: Add data for ILCE-7RM4, and ILCE-1 if(plistener) { plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_PIXELSHIFT"))); plistener->setProgress(0.0); @@ -610,18 +611,29 @@ BENCHFUN int nReadIndex = static_cast(round(log2(idata->getISOSpeed() / 100.f) * 3.f)); - if(model.find("K-3") != string::npos) { - nRead = nReadK3II[nReadIndex]; - eperIsoModel = ePerIsoK3II; - } else if(model.find("K-1") != string::npos) { // this also matches K-1 Mark II - nRead = nReadK1[nReadIndex]; - eperIsoModel = ePerIsoK1; - } else if(model.find("ILCE-7RM3") != string::npos) { - nRead = nReadILCE7RM3[nReadIndex]; - eperIsoModel = ePerIsoILCE7RM3; - } else { // as long as we don't have values for Pentax KP, we use the values from K-70 - nRead = nReadK70[nReadIndex]; - eperIsoModel = ePerIsoK70; + if(make.find("Sony") != string::npos) { + if(model.find("ILCE-7RM3") != string::npos) { + nRead = nReadILCE7RM3[nReadIndex]; + eperIsoModel = ePerIsoILCE7RM3; + /* TODO: When we have data for missing ILCE-7RM4, and ILCE-1, add it here + } else if(model.find("ILCE-7RM4") != string::npos) { + } else if(model.find("ILCE-1") != string::npos) { + */ + } else { // default to ILCE-7RM3 for Sony cameras without data + nRead = nReadILCE7RM3[nReadIndex]; + eperIsoModel = ePerIsoILCE7RM3; + } + } else { // Pentax + if(model.find("K-3") != string::npos) { + nRead = nReadK3II[nReadIndex]; + eperIsoModel = ePerIsoK3II; + } else if(model.find("K-1") != string::npos) { // this also matches K-1 Mark II + nRead = nReadK1[nReadIndex]; + eperIsoModel = ePerIsoK1; + } else { // as long as we don't have values for Pentax KP, we use the values from K-70 + nRead = nReadK70[nReadIndex]; + eperIsoModel = ePerIsoK70; + } } eperIsoModel *= pow(2.f, eperIso - 1.f); From 88160bd8b858256260253546b5b014f7b9991259 Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 30 Jun 2024 02:53:49 +0000 Subject: [PATCH 63/78] Update PREFERENCES_PARSEDEXTDELHINT (default/English) --- rtdata/languages/English (UK) | 2 +- rtdata/languages/English (US) | 2 +- rtdata/languages/default | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 37ccdc48f..5d22fa61f 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -2154,7 +2154,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PREFERENCES_PARSEDEXT;Parsed Extensions !PREFERENCES_PARSEDEXTADD;Add extension !PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. -!PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. +!PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list.\nPredefined extensions cannot be deleted. !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. !PREFERENCES_PERFORMANCE_MEASURE;Measure diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 079713ac1..4cd01622a 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -1971,7 +1971,7 @@ !PREFERENCES_PARSEDEXT;Parsed Extensions !PREFERENCES_PARSEDEXTADD;Add extension !PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. -!PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. +!PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list.\nPredefined extensions cannot be deleted. !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. !PREFERENCES_PERFORMANCE_MEASURE;Measure diff --git a/rtdata/languages/default b/rtdata/languages/default index 75d060dec..7a4c8aea7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2038,7 +2038,7 @@ PREFERENCES_PANFACTORLABEL;Pan rate amplification PREFERENCES_PARSEDEXT;Parsed Extensions PREFERENCES_PARSEDEXTADD;Add extension PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. -PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. +PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list.\nPredefined extensions cannot be deleted. PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. PREFERENCES_PERFORMANCE_MEASURE;Measure From 7168870d695d887e65c4bf595843d1170b542ea7 Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 30 Jun 2024 02:55:30 +0000 Subject: [PATCH 64/78] Improve empty string check --- rtgui/preferences.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 94dc68e65..f6f80a2d3 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -2701,7 +2701,7 @@ void Preferences::extensionsChanged() void Preferences::extensionChanged() { - if (extension->get_text()[0] == '\0') { + if (extension->get_text().empty()) { addExt->set_sensitive(false); return; } From 819b65af7fc0b6b62d598681b8a5b47103d73068 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 30 Jun 2024 07:47:55 +0200 Subject: [PATCH 65/78] Keep values scope from 5.10 Selective Editing - for color & light - shadow/highlight - vibrance #7102 (#7107) * ppversion 351 and keep valus scope for color and light shadow-highligt vibrance * Change comment in ppversion.h * Change procparams for colorscope pp<351 * Remove not used isset --- rtengine/improccoordinator.cc | 16 ++++++++++------ rtengine/procparams.cc | 29 ++++++++++++++++++++++++++--- rtgui/ppversion.h | 4 +++- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 46dd7bc29..127c65248 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1170,9 +1170,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (params->locallab.spots.at(sp).equilret && params->locallab.spots.at(sp).expreti) { savenormreti.reset(new LabImage(*oprevl, true)); } - if(params->locallab.spots.at(sp).colorscope != 30) {//compatibility with old method in controlspotpanel to change scope - default value 30 - scopefp[sp]= params->locallab.spots.at(sp).colorscope; - } + + // if(params->locallab.spots.at(sp).colorscope != 30) {//compatibility with old method in controlspotpanel to change scope - default value 30 + // scopefp[sp]= params->locallab.spots.at(sp).colorscope; + // } + // Set local curves of current spot to LUT locRETgainCurve.Set(params->locallab.spots.at(sp).localTgaincurve); locRETtransCurve.Set(params->locallab.spots.at(sp).localTtranscurve); @@ -1587,7 +1589,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) bool islog = params->locallab.spots.at(sp).explog; bool ismas = params->locallab.spots.at(sp).expmask; bool iscie = params->locallab.spots.at(sp).expcie; - bool isset = iscolor || issh || isvib; + // bool isset = iscolor || issh || isvib; //set select spot settings LocallabListener::locallabsetLC locsetlc; @@ -1615,13 +1617,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locallListener->cieChanged(locallcielc,params->locallab.selspot); } locallListener->sigChanged(locallciesig,params->locallab.selspot); - if(params->locallab.spots.at(sp).colorscope != 30) {//compatibility with old method in controlspotpanel + /* + if(params->locallab.spots.at(sp).colorscope != 0) {//compatibility with old method in controlspotpanel locallListener->scopeChangedcol(scopefp[sp], params->locallab.selspot, iscolor); locallListener->scopeChangedsh(scopefp[sp], params->locallab.selspot, issh); locallListener->scopeChangedvib(scopefp[sp], params->locallab.selspot, isvib); locallListener->scopeChangedset(scopefp[sp], params->locallab.selspot, isset); - params->locallab.spots.at(sp).colorscope = 30; + //params->locallab.spots.at(sp).colorscope = 30; } + */ // if (mainfp[sp] >= 0) {//minimize call to idle register //used by Global fullimage. locallListener->maiChanged(locallsetlc,params->locallab.selspot); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 1ba92c366..d5cad43c9 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -9144,7 +9144,16 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "labgridAHighmerg_" + index_str, spot.labgridAHighmerg, spotEdited.labgridAHighmerg); assignFromKeyfile(keyFile, "Locallab", "labgridBHighmerg_" + index_str, spot.labgridBHighmerg, spotEdited.labgridBHighmerg); assignFromKeyfile(keyFile, "Locallab", "Strengthgrid_" + index_str, spot.strengthgrid, spotEdited.strengthgrid); - assignFromKeyfile(keyFile, "Locallab", "Sensi_" + index_str, spot.sensi, spotEdited.sensi); + assignFromKeyfile(keyFile, "Locallab", "Colorscope_" + index_str, spot.colorscope, spotEdited.colorscope); + + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Colorscope_" + index_str)) { + spot.sensi = keyFile.get_integer("Locallab", "Colorscope_" + index_str); + spotEdited.sensi = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Sensi_" + index_str, spot.sensi, spotEdited.sensi); + } assignFromKeyfile(keyFile, "Locallab", "Structcol_" + index_str, spot.structcol, spotEdited.structcol); assignFromKeyfile(keyFile, "Locallab", "Strcol_" + index_str, spot.strcol, spotEdited.strcol); assignFromKeyfile(keyFile, "Locallab", "Strcolab_" + index_str, spot.strcolab, spotEdited.strcolab); @@ -9282,7 +9291,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "shadows_" + index_str, spot.shadows, spotEdited.shadows); assignFromKeyfile(keyFile, "Locallab", "s_tonalwidth_" + index_str, spot.s_tonalwidth, spotEdited.s_tonalwidth); assignFromKeyfile(keyFile, "Locallab", "sh_radius_" + index_str, spot.sh_radius, spotEdited.sh_radius); - assignFromKeyfile(keyFile, "Locallab", "sensihs_" + index_str, spot.sensihs, spotEdited.sensihs); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Colorscope_" + index_str)) { + spot.sensihs = keyFile.get_integer("Locallab", "Colorscope_" + index_str); + spotEdited.sensihs = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "sensihs_" + index_str, spot.sensihs, spotEdited.sensihs); + } assignFromKeyfile(keyFile, "Locallab", "EnaSHMask_" + index_str, spot.enaSHMask, spotEdited.enaSHMask); assignFromKeyfile(keyFile, "Locallab", "CCmaskSHCurve_" + index_str, spot.CCmaskSHcurve, spotEdited.CCmaskSHcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskSHCurve_" + index_str, spot.LLmaskSHcurve, spotEdited.LLmaskSHcurve); @@ -9336,7 +9352,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "ProtectSkins_" + index_str, spot.protectskins, spotEdited.protectskins); assignFromKeyfile(keyFile, "Locallab", "AvoidColorShift_" + index_str, spot.avoidcolorshift, spotEdited.avoidcolorshift); assignFromKeyfile(keyFile, "Locallab", "PastSatTog_" + index_str, spot.pastsattog, spotEdited.pastsattog); - assignFromKeyfile(keyFile, "Locallab", "Sensiv_" + index_str, spot.sensiv, spotEdited.sensiv); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Colorscope_" + index_str)) { + spot.sensiv = keyFile.get_integer("Locallab", "Colorscope_" + index_str); + spotEdited.sensiv = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Sensiv_" + index_str, spot.sensiv, spotEdited.sensiv); + } assignFromKeyfile(keyFile, "Locallab", "SkinTonesCurve_" + index_str, spot.skintonescurve, spotEdited.skintonescurve); assignFromKeyfile(keyFile, "Locallab", "CCmaskvibCurve_" + index_str, spot.CCmaskvibcurve, spotEdited.CCmaskvibcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskvibCurve_" + index_str, spot.LLmaskvibcurve, spotEdited.LLmaskvibcurve); diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index f2455699c..6b7909edf 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,11 +1,13 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 350 +#define PPVERSION 351 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes + 351 2024-06-19 + take into account Global in selective editing 350 2023-03-05 introduced white balance standard observer 349 2020-10-29 From 89c90774af8df5cc1f37fc556a286b2603b9318e Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 1 Jul 2024 09:35:33 +0200 Subject: [PATCH 66/78] Selective Editing - compatibility 5.10 - Feather - Log encoding (#7120) * Fixed pp3 from 5.10 feather and ciecam log encoding * Fixed 2 wrong typo feather in procparams.cc * Fixed 2 wrong typo feather in procparams.cc * Remove unused line in procparams --- rtengine/procparams.cc | 86 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 77 insertions(+), 9 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index d5cad43c9..b868a7627 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -9159,7 +9159,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Strcolab_" + index_str, spot.strcolab, spotEdited.strcolab); assignFromKeyfile(keyFile, "Locallab", "Strcolh_" + index_str, spot.strcolh, spotEdited.strcolh); assignFromKeyfile(keyFile, "Locallab", "Angcol_" + index_str, spot.angcol, spotEdited.angcol); - assignFromKeyfile(keyFile, "Locallab", "Fetahercol_" + index_str, spot.feathercol, spotEdited.feathercol); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.feathercol = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.feathercol = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Feathercol_" + index_str, spot.feathercol, spotEdited.feathercol); + } assignFromKeyfile(keyFile, "Locallab", "Blurcolde_" + index_str, spot.blurcolde, spotEdited.blurcolde); assignFromKeyfile(keyFile, "Locallab", "Blurcol_" + index_str, spot.blurcol, spotEdited.blurcol); assignFromKeyfile(keyFile, "Locallab", "Contcol_" + index_str, spot.contcol, spotEdited.contcol); @@ -9236,7 +9243,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Gamex_" + index_str, spot.gamex, spotEdited.gamex); assignFromKeyfile(keyFile, "Locallab", "Strexp_" + index_str, spot.strexp, spotEdited.strexp); assignFromKeyfile(keyFile, "Locallab", "Angexp_" + index_str, spot.angexp, spotEdited.angexp); - assignFromKeyfile(keyFile, "Locallab", "Featherexp_" + index_str, spot.featherexp, spotEdited.featherexp); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.featherexp = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.featherexp = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Featherexp_" + index_str, spot.featherexp, spotEdited.featherexp); + } assignFromKeyfile(keyFile, "Locallab", "ExCurve_" + index_str, spot.excurve, spotEdited.excurve); assignFromKeyfile(keyFile, "Locallab", "Norm_" + index_str, spot.norm, spotEdited.norm); assignFromKeyfile(keyFile, "Locallab", "Inversex_" + index_str, spot.inversex, spotEdited.inversex); @@ -9308,7 +9322,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "BlurSHde_" + index_str, spot.blurSHde, spotEdited.blurSHde); assignFromKeyfile(keyFile, "Locallab", "StrSH_" + index_str, spot.strSH, spotEdited.strSH); assignFromKeyfile(keyFile, "Locallab", "AngSH_" + index_str, spot.angSH, spotEdited.angSH); - assignFromKeyfile(keyFile, "Locallab", "FeatherSH_" + index_str, spot.featherSH, spotEdited.featherSH); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.featherSH = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.featherSH = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "FeatherSH_" + index_str, spot.featherSH, spotEdited.featherSH); + } + assignFromKeyfile(keyFile, "Locallab", "Inverssh_" + index_str, spot.inverssh, spotEdited.inverssh); assignFromKeyfile(keyFile, "Locallab", "ChromaskSH_" + index_str, spot.chromaskSH, spotEdited.chromaskSH); assignFromKeyfile(keyFile, "Locallab", "GammaskSH_" + index_str, spot.gammaskSH, spotEdited.gammaskSH); @@ -9375,7 +9397,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Strvibab_" + index_str, spot.strvibab, spotEdited.strvibab); assignFromKeyfile(keyFile, "Locallab", "Strvibh_" + index_str, spot.strvibh, spotEdited.strvibh); assignFromKeyfile(keyFile, "Locallab", "Angvib_" + index_str, spot.angvib, spotEdited.angvib); - assignFromKeyfile(keyFile, "Locallab", "Feathervib_" + index_str, spot.feathervib, spotEdited.feathervib); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.feathervib = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.feathervib = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Feathervib_" + index_str, spot.feathervib, spotEdited.feathervib); + } + assignFromKeyfile(keyFile, "Locallab", "LmaskvibCurve_" + index_str, spot.Lmaskvibcurve, spotEdited.Lmaskvibcurve); assignFromKeyfile(keyFile, "Locallab", "Recothresv_" + index_str, spot.recothresv, spotEdited.recothresv); assignFromKeyfile(keyFile, "Locallab", "Lowthresv_" + index_str, spot.lowthresv, spotEdited.lowthresv); @@ -9625,7 +9655,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Sigmalc2_" + index_str, spot.sigmalc2, spotEdited.sigmalc2); assignFromKeyfile(keyFile, "Locallab", "Strwav_" + index_str, spot.strwav, spotEdited.strwav); assignFromKeyfile(keyFile, "Locallab", "Angwav_" + index_str, spot.angwav, spotEdited.angwav); - assignFromKeyfile(keyFile, "Locallab", "Featherwav_" + index_str, spot.featherwav, spotEdited.featherwav); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.featherwav = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.featherwav = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Featherwav_" + index_str, spot.featherwav, spotEdited.featherwav); + } + assignFromKeyfile(keyFile, "Locallab", "Strengthw_" + index_str, spot.strengthw, spotEdited.strengthw); assignFromKeyfile(keyFile, "Locallab", "Sigmaed_" + index_str, spot.sigmaed, spotEdited.sigmaed); assignFromKeyfile(keyFile, "Locallab", "Radiusw_" + index_str, spot.radiusw, spotEdited.radiusw); @@ -9740,7 +9778,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "AutoGray_" + index_str, spot.Autogray, spotEdited.Autogray); assignFromKeyfile(keyFile, "Locallab", "Fullimage_" + index_str, spot.fullimage, spotEdited.fullimage); assignFromKeyfile(keyFile, "Locallab", "Repart_" + index_str, spot.repar, spotEdited.repar); - assignFromKeyfile(keyFile, "Locallab", "Ciecam_" + index_str, spot.ciecam, spotEdited.ciecam); + if (ppVersion <= 350) {//issue 7114 + if (keyFile.has_key("Locallab", "Ciecam_" + index_str)) { + spot.ciecam = true; + spotEdited.ciecam = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Ciecam_" + index_str, spot.ciecam, spotEdited.ciecam); + } + assignFromKeyfile(keyFile, "Locallab", "Satlog_" + index_str, spot.satlog, spotEdited.satlog); assignFromKeyfile(keyFile, "Locallab", "BlackEv_" + index_str, spot.blackEv, spotEdited.blackEv); assignFromKeyfile(keyFile, "Locallab", "WhiteEv_" + index_str, spot.whiteEv, spotEdited.whiteEv); @@ -9755,7 +9801,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Surround_" + index_str, spot.surround, spotEdited.surround); assignFromKeyfile(keyFile, "Locallab", "Strlog_" + index_str, spot.strlog, spotEdited.strlog); assignFromKeyfile(keyFile, "Locallab", "Anglog_" + index_str, spot.anglog, spotEdited.anglog); - assignFromKeyfile(keyFile, "Locallab", "Featherlog_" + index_str, spot.featherlog, spotEdited.featherlog); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.featherlog = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.featherlog = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Featherlog_" + index_str, spot.featherlog, spotEdited.featherlog); + } assignFromKeyfile(keyFile, "Locallab", "CCmaskCurveL_" + index_str, spot.CCmaskcurveL, spotEdited.CCmaskcurveL); assignFromKeyfile(keyFile, "Locallab", "LLmaskCurveL_" + index_str, spot.LLmaskcurveL, spotEdited.LLmaskcurveL); assignFromKeyfile(keyFile, "Locallab", "HHmaskCurveL_" + index_str, spot.HHmaskcurveL, spotEdited.HHmaskcurveL); @@ -9793,7 +9846,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Shadmask_" + index_str, spot.shadmask, spotEdited.shadmask); assignFromKeyfile(keyFile, "Locallab", "Str_mask_" + index_str, spot.str_mask, spotEdited.str_mask); assignFromKeyfile(keyFile, "Locallab", "Ang_mask_" + index_str, spot.ang_mask, spotEdited.ang_mask); - assignFromKeyfile(keyFile, "Locallab", "Feather_mask_" + index_str, spot.feather_mask, spotEdited.feather_mask); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.feather_mask = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.feather_mask = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Feather_mask_" + index_str, spot.feather_mask, spotEdited.feather_mask); + } + assignFromKeyfile(keyFile, "Locallab", "HHhmask_Curve_" + index_str, spot.HHhmask_curve, spotEdited.HHhmask_curve); assignFromKeyfile(keyFile, "Locallab", "Lmask_Curve_" + index_str, spot.Lmask_curve, spotEdited.Lmask_curve); assignFromKeyfile(keyFile, "Locallab", "LLmask_Curvewav_" + index_str, spot.LLmask_curvewav, spotEdited.LLmask_curvewav); @@ -9956,7 +10017,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Surroundcie_" + index_str, spot.surroundcie, spotEdited.surroundcie); assignFromKeyfile(keyFile, "Locallab", "Strgradcie_" + index_str, spot.strgradcie, spotEdited.strgradcie); assignFromKeyfile(keyFile, "Locallab", "Anggradcie_" + index_str, spot.anggradcie, spotEdited.anggradcie); - assignFromKeyfile(keyFile, "Locallab", "Feathercie_" + index_str, spot.feathercie, spotEdited.feathercie); + if (ppVersion <= 350) { + if (keyFile.has_key("Locallab", "Feather_" + index_str)) { + spot.feathercie = keyFile.get_integer("Locallab", "Feather_" + index_str); + spotEdited.feathercie = true; + } + } else { + assignFromKeyfile(keyFile, "Locallab", "Feathercie_" + index_str, spot.feathercie, spotEdited.feathercie); + } assignFromKeyfile(keyFile, "Locallab", "EnacieMask_" + index_str, spot.enacieMask, spotEdited.enacieMask); assignFromKeyfile(keyFile, "Locallab", "EnacieMaskall_" + index_str, spot.enacieMaskall, spotEdited.enacieMaskall); From 363f3cc2a65fa5c3d96ed519247eb073b9f9cd20 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Sat, 15 Jun 2024 09:04:22 +0200 Subject: [PATCH 67/78] iptransform: correct profile based distortion/CA before rotation Like perspective correction also rotation correction should be applied after distortion/CA correction. --- rtengine/iptransform.cc | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 3d384ee62..d62a87199 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -515,14 +515,14 @@ bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, break; } - if (pLCPMap && params->lensProf.useDist) { - pLCPMap->correctDistortion(x_d, y_d, w2, h2); - } - // rotate double Dx = x_d * cost - y_d * sint; double Dy = x_d * sint + y_d * cost; + if (pLCPMap && params->lensProf.useDist) { + pLCPMap->correctDistortion(Dx, Dy, w2, h2); + } + // distortion correction double s = 1; @@ -700,7 +700,7 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, } } transformGeneral(highQuality, original, dest, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap.get(), useOriginalBuffer); - + if (highQuality && dest != transformed) { transformLCPCAOnly(dest, transformed, cx, cy, pLCPMap.get(), useOriginalBuffer); } @@ -1240,25 +1240,25 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I break; } - if (enableLCPDist) { - pLCPMap->correctDistortion(x_d, y_d, w2, h2); - } - // rotate - const double Dxc = x_d * cost - y_d * sint; - const double Dyc = x_d * sint + y_d * cost; + double Dxr = x_d * cost - y_d * sint; + double Dyr = x_d * sint + y_d * cost; + + if (enableLCPDist) { + pLCPMap->correctDistortion(Dxr, Dyr, w2, h2); + } // distortion correction double s = 1.0; if (enableDistortion) { - const double r = sqrt(Dxc * Dxc + Dyc * Dyc) / maxRadius; + const double r = sqrt(Dxr * Dxr + Dyr * Dyr) / maxRadius; s = 1.0 - distAmount + distAmount * r; } for (int c = 0; c < (enableCA ? 3 : 1); ++c) { - double Dx = Dxc * (s + chDist[c]); - double Dy = Dyc * (s + chDist[c]); + double Dx = Dxr * (s + chDist[c]); + double Dy = Dyr * (s + chDist[c]); // de-center Dx += w2; @@ -1386,7 +1386,7 @@ void ImProcFunctions::transformLCPCAOnly(Imagefloat *original, Imagefloat *trans for (int c = 0; c < 3; c++) { double Dx = x; double Dy = y; - + pLCPMap->correctCA(Dx, Dy, cx, cy, c); // Extract integer and fractions of coordinates @@ -1522,4 +1522,3 @@ bool ImProcFunctions::needsTransform (int oW, int oH, int rawRotationDeg, const } - From 55fd4b975e48141e73e068c8332a46caba5755d1 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 09:34:14 +0200 Subject: [PATCH 68/78] iptransform: move profile based CA with and after distortion Doing profile based CA as the really first correction in a separate steps is probably not useful. Additionally many lens profile (lensfun) and future one provide functions to do them in a single step with better precision while other just provide a single step that does both (i.e. DNG WarpRectilinear). For the above reasons this patch removes the additional pass for CA correction. This will also improve the perfomance due to less work. --- rtengine/iptransform.cc | 136 +++++++++------------------------------- 1 file changed, 29 insertions(+), 107 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index d62a87199..757d3d54c 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -420,7 +420,6 @@ homogeneous::Matrix perspectiveMatrix(double camera_focal_length, double bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, std::vector &red, std::vector &green, std::vector &blue, double ascaleDef, const LensCorrection *pLCPMap) const { - enum PerspType { NONE, SIMPLE, CAMERA_BASED }; const PerspType perspectiveType = needsPerspective() ? ( (params->perspective.method == "camera_based") ? @@ -686,24 +685,8 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, highQuality = false; } else { highQuality = true; - // agriggio: CA correction via the lens profile has to be - // performed before separately from the the other transformations - // (except for the coarse rotation/flipping). In order to not - // change the code too much, I simply introduced a new mode - // TRANSFORM_HIGH_QUALITY_CA, which applies *only* profile-based - // CA correction. So, the correction in this case occurs in two - // steps, using an intermediate temporary image. There's room for - // optimization of course... - if (pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable()) { - tmpimg.reset(new Imagefloat(transformed->getWidth(), transformed->getHeight())); - dest = tmpimg.get(); - } } transformGeneral(highQuality, original, dest, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap.get(), useOriginalBuffer); - - if (highQuality && dest != transformed) { - transformLCPCAOnly(dest, transformed, cx, cy, pLCPMap.get(), useOriginalBuffer); - } } } @@ -1095,7 +1078,9 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I // set up stuff, depending on the mode we are enum PerspType { NONE, SIMPLE, CAMERA_BASED }; const bool enableLCPDist = pLCPMap && params->lensProf.useDist; + const bool enableLCPCA = pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable(); const bool enableCA = highQuality && needsCA(); + const bool doCACorrection = enableCA || enableLCPCA; const bool enableGradient = needsGradient(); const bool enablePCVignetting = needsPCVignetting(); const bool enableVignetting = needsVignetting(); @@ -1241,24 +1226,32 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I } // rotate - double Dxr = x_d * cost - y_d * sint; - double Dyr = x_d * sint + y_d * cost; + const double Dxr = x_d * cost - y_d * sint; + const double Dyr = x_d * sint + y_d * cost; - if (enableLCPDist) { - pLCPMap->correctDistortion(Dxr, Dyr, w2, h2); - } + for (int c = 0; c < (doCACorrection ? 3 : 1); ++c) { + double Dx = Dxr; + double Dy = Dyr; - // distortion correction - double s = 1.0; + if (enableLCPCA) { + pLCPMap->correctCA(Dx, Dy, w2, h2, c); + } - if (enableDistortion) { - const double r = sqrt(Dxr * Dxr + Dyr * Dyr) / maxRadius; - s = 1.0 - distAmount + distAmount * r; - } + if (enableLCPDist) { + pLCPMap->correctDistortion(Dx, Dy, w2, h2); + } - for (int c = 0; c < (enableCA ? 3 : 1); ++c) { - double Dx = Dxr * (s + chDist[c]); - double Dy = Dyr * (s + chDist[c]); + // distortion correction + double s = 1.0; + + if (enableDistortion) { + const double r = sqrt(Dx * Dx + Dy * Dy) / maxRadius; + s = 1.0 - distAmount + distAmount * r; + } + + // CA correction + Dx *= s + chDist[c]; + Dy *= s + chDist[c]; // de-center Dx += w2; @@ -1305,13 +1298,13 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I transformed->g(y, x) = vignmul * (original->g(yc, xc) * (1.0 - Dx) * (1.0 - Dy) + original->g(yc, xc + 1) * Dx * (1.0 - Dy) + original->g(yc + 1, xc) * (1.0 - Dx) * Dy + original->g(yc + 1, xc + 1) * Dx * Dy); transformed->b(y, x) = vignmul * (original->b(yc, xc) * (1.0 - Dx) * (1.0 - Dy) + original->b(yc, xc + 1) * Dx * (1.0 - Dy) + original->b(yc + 1, xc) * (1.0 - Dx) * Dy + original->b(yc + 1, xc + 1) * Dx * Dy); } else if (!useLog) { - if (enableCA) { + if (doCACorrection) { interpolateTransformChannelsCubic(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], vignmul); } else { interpolateTransformCubic(original, xc - 1, yc - 1, Dx, Dy, transformed->r(y, x), transformed->g(y, x), transformed->b(y, x), vignmul); } } else { - if (enableCA) { + if (doCACorrection) { interpolateTransformChannelsCubicLog(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], vignmul); } else { interpolateTransformCubicLog(original, xc - 1, yc - 1, Dx, Dy, transformed->r(y, x), transformed->g(y, x), transformed->b(y, x), vignmul); @@ -1325,7 +1318,7 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I const int x2 = LIM(xc + 1, 0, original->getWidth() - 1); if (useLog) { - if (enableCA) { + if (doCACorrection) { chTrans[c][y][x] = vignmul * xexpf(chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); } else { transformed->r(y, x) = vignmul * xexpf(original->r(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->r(y1, x2) * Dx * (1.0 - Dy) + original->r(y2, x1) * (1.0 - Dx) * Dy + original->r(y2, x2) * Dx * Dy); @@ -1333,7 +1326,7 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I transformed->b(y, x) = vignmul * xexpf(original->b(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->b(y1, x2) * Dx * (1.0 - Dy) + original->b(y2, x1) * (1.0 - Dx) * Dy + original->b(y2, x2) * Dx * Dy); } } else { - if (enableCA) { + if (doCACorrection) { chTrans[c][y][x] = vignmul * (chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); } else { transformed->r(y, x) = vignmul * (original->r(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->r(y1, x2) * Dx * (1.0 - Dy) + original->r(y2, x1) * (1.0 - Dx) * Dy + original->r(y2, x2) * Dx * Dy); @@ -1343,7 +1336,7 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I } } } else { - if (enableCA) { + if (doCACorrection) { // not valid (source pixel x,y not inside source image, etc.) chTrans[c][y][x] = 0; } else { @@ -1357,77 +1350,6 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I } } - -void ImProcFunctions::transformLCPCAOnly(Imagefloat *original, Imagefloat *transformed, int cx, int cy, const LensCorrection *pLCPMap, bool useOriginalBuffer) -{ - assert(pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable()); - const bool useLog = params->commonTrans.method == "log"; - - float** chTrans[3] = {transformed->r.ptrs, transformed->g.ptrs, transformed->b.ptrs}; - - std::unique_ptr tempLog; - if (useLog) { - if (!useOriginalBuffer) { - tempLog.reset(new Imagefloat(original->getWidth(), original->getHeight())); - logEncode(original, tempLog.get(), multiThread); - original = tempLog.get(); - } else { - logEncode(original, original, multiThread); - } - } - float** chOrig[3] = {original->r.ptrs, original->g.ptrs, original->b.ptrs}; - -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - - for (int y = 0; y < transformed->getHeight(); y++) { - for (int x = 0; x < transformed->getWidth(); x++) { - for (int c = 0; c < 3; c++) { - double Dx = x; - double Dy = y; - - pLCPMap->correctCA(Dx, Dy, cx, cy, c); - - // Extract integer and fractions of coordinates - int xc = (int)Dx; - Dx -= (double)xc; - int yc = (int)Dy; - Dy -= (double)yc; - - // Convert only valid pixels - if (yc >= 0 && yc < original->getHeight() && xc >= 0 && xc < original->getWidth()) { - - // multiplier for vignetting correction - if (yc > 0 && yc < original->getHeight() - 2 && xc > 0 && xc < original->getWidth() - 2) { - // all interpolation pixels inside image - if (!useLog) { - interpolateTransformChannelsCubic(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], 1.0); - } else { - interpolateTransformChannelsCubicLog(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], 1.0); - } - } else { - // edge pixels - int y1 = LIM (yc, 0, original->getHeight() - 1); - int y2 = LIM (yc + 1, 0, original->getHeight() - 1); - int x1 = LIM (xc, 0, original->getWidth() - 1); - int x2 = LIM (xc + 1, 0, original->getWidth() - 1); - if (!useLog) { - chTrans[c][y][x] = (chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); - } else { - chTrans[c][y][x] = xexpf(chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); - } - } - } else { - // not valid (source pixel x,y not inside source image, etc.) - chTrans[c][y][x] = 0; - } - } - } - } -} - - double ImProcFunctions::getTransformAutoFill (int oW, int oH, const LensCorrection *pLCPMap) const { if (!needsCA() && !needsDistortion() && !needsRotation() && !needsPerspective() && (!params->lensProf.useDist || pLCPMap == nullptr)) { From dc0e23c82c4ebedd901fb66593702ae3fb6df724 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 20:02:15 +0200 Subject: [PATCH 69/78] iptransform: apply distortion and CA correction in a single pass Some lens profile methods provides a way to correct distortion and CA in a single step. When available, applying distortion and CA correction when both enabled in a single pass is more precise (see lensfun ApplySubpixelGeometryDistortion doc) since it's usually how the profile is done. Instead applying the CA correction in a step after distortion correction could lead to a bit different (also if not always visible) correction. This is also required for future lens correction methods (like DNG WarpRectilinear or corrections based on vendor metadata) that provides only merged distortion and CA correction in a single pass. --- rtengine/iptransform.cc | 10 +++++----- rtengine/lcp.cc | 6 ++++++ rtengine/lcp.h | 3 +++ rtengine/rtlensfun.cc | 30 +++++++++++++++++++++++++++--- rtengine/rtlensfun.h | 1 + 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 757d3d54c..08ee9a4a0 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -1233,12 +1233,12 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I double Dx = Dxr; double Dy = Dyr; - if (enableLCPCA) { - pLCPMap->correctCA(Dx, Dy, w2, h2, c); - } - - if (enableLCPDist) { + if (enableLCPDist && enableLCPCA) { + pLCPMap->correctDistortionAndCA(Dx, Dy, w2, h2, c); + } else if (enableLCPDist) { pLCPMap->correctDistortion(Dx, Dy, w2, h2); + } else if (enableLCPCA) { + pLCPMap->correctCA(Dx, Dy, w2, h2, c); } // distortion correction diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index 7507bbb11..ba96147dc 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -990,6 +990,12 @@ bool rtengine::LCPMapper::isCACorrectionAvailable() const return enableCA; } +void rtengine::LCPMapper::correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const +{ + correctDistortion(x, y, cx, cy); + correctCA(x, y, cx, cy, channel); +} + void rtengine::LCPMapper::correctDistortion(double &x, double &y, int cx, int cy) const { x += cx; diff --git a/rtengine/lcp.h b/rtengine/lcp.h index b59cc84c6..97cdd0890 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -166,6 +166,8 @@ private: class LensCorrection { public: virtual ~LensCorrection() {} + + virtual void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const = 0; virtual void correctDistortion(double &x, double &y, int cx, int cy) const = 0; virtual bool isCACorrectionAvailable() const = 0; virtual void correctCA(double &x, double &y, int cx, int cy, int channel) const = 0; @@ -194,6 +196,7 @@ public: ); + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const override; void correctDistortion(double &x, double &y, int cx, int cy) const override; bool isCACorrectionAvailable() const override; void correctCA(double& x, double& y, int cx, int cy, int channel) const override; diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 08010f50f..505346ad0 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -125,7 +125,6 @@ void LFModifier::correctDistortion(double &x, double &y, int cx, int cy) const } } - bool LFModifier::isCACorrectionAvailable() const { return (flags_ & LF_MODIFY_TCA); @@ -141,7 +140,7 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co // channels. We could consider caching the info to speed this up x += cx; y += cy; - + float pos[6]; if (swap_xy_) { std::swap(x, y); @@ -156,6 +155,31 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co y -= cy; } +void LFModifier::correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const +{ + assert(channel >= 0 && channel <= 2); + + // RT currently applies the CA correction per channel, whereas + // lensfun applies it to all the three channels simultaneously. This means + // we do the work 3 times, because each time we discard 2 of the 3 + // channels. We could consider caching the info to speed this up + x += cx; + y += cy; + + float pos[6]; + if (swap_xy_) { + std::swap(x, y); + } + data_->ApplySubpixelGeometryDistortion(x, y, 1, 1, pos); // This is thread-safe + x = pos[2*channel]; + y = pos[2*channel+1]; + if (swap_xy_) { + std::swap(x, y); + } + x -= cx; + y -= cy; +} + #ifdef _OPENMP void LFModifier::processVignette(int width, int height, float** rawData) const { @@ -396,7 +420,7 @@ bool LFDatabase::init(const Glib::ustring &dbdir) if (settings->verbose) { std::cout << (ok ? "OK" : "FAIL") << std::endl; } - + return ok; } diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 1d941246f..39ca67ec2 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -53,6 +53,7 @@ public: explicit operator bool() const; + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const override; void correctDistortion(double &x, double &y, int cx, int cy) const override; bool isCACorrectionAvailable() const override; void correctCA(double &x, double &y, int cx, int cy, int channel) const override; From b98fa4285720ccc1caeb475904af03c9649d4a79 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 20:03:07 +0200 Subject: [PATCH 70/78] lens profile: report availability of distortion and vignetting Beside CA, report also distortion and vignetting availability. Rename is${CORRECTION}Available methods to has${CORRECTION}. --- rtengine/iptransform.cc | 6 +++--- rtengine/lcp.cc | 14 +++++++++++++- rtengine/lcp.h | 10 ++++++++-- rtengine/rtlensfun.cc | 20 +++++++++++++++----- rtengine/rtlensfun.h | 5 ++++- 5 files changed, 43 insertions(+), 12 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 08ee9a4a0..468507385 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -518,7 +518,7 @@ bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, double Dx = x_d * cost - y_d * sint; double Dy = x_d * sint + y_d * cost; - if (pLCPMap && params->lensProf.useDist) { + if (pLCPMap && params->lensProf.useDist && pLCPMap->hasDistortionCorrection()) { pLCPMap->correctDistortion(Dx, Dy, w2, h2); } @@ -1077,8 +1077,8 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I // set up stuff, depending on the mode we are enum PerspType { NONE, SIMPLE, CAMERA_BASED }; - const bool enableLCPDist = pLCPMap && params->lensProf.useDist; - const bool enableLCPCA = pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable(); + const bool enableLCPDist = pLCPMap && params->lensProf.useDist && pLCPMap->hasDistortionCorrection(); + const bool enableLCPCA = pLCPMap && params->lensProf.useCA && pLCPMap->hasCACorrection(); const bool enableCA = highQuality && needsCA(); const bool doCACorrection = enableCA || enableLCPCA; const bool enableGradient = needsGradient(); diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index ba96147dc..0947cf709 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -985,11 +985,23 @@ rtengine::LCPMapper::LCPMapper( isFisheye = pProf->isFisheye; } -bool rtengine::LCPMapper::isCACorrectionAvailable() const +bool rtengine::LCPMapper::hasDistortionCorrection() const +{ + // assume lcp always provides distortion correction + return true; +} + +bool rtengine::LCPMapper::hasCACorrection() const { return enableCA; } +bool rtengine::LCPMapper::hasVignettingCorrection() const +{ + // assume lcp always provides vignetting correction + return true; +} + void rtengine::LCPMapper::correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const { correctDistortion(x, y, cx, cy); diff --git a/rtengine/lcp.h b/rtengine/lcp.h index 97cdd0890..114131b4a 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -167,9 +167,12 @@ class LensCorrection { public: virtual ~LensCorrection() {} + virtual bool hasDistortionCorrection() const = 0; + virtual bool hasCACorrection() const = 0; + virtual bool hasVignettingCorrection() const = 0; + virtual void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const = 0; virtual void correctDistortion(double &x, double &y, int cx, int cy) const = 0; - virtual bool isCACorrectionAvailable() const = 0; virtual void correctCA(double &x, double &y, int cx, int cy, int channel) const = 0; virtual void processVignette(int width, int height, float** rawData) const = 0; virtual void processVignette3Channels(int width, int height, float** rawData) const = 0; @@ -196,9 +199,12 @@ public: ); + bool hasDistortionCorrection() const override; + bool hasCACorrection() const override; + bool hasVignettingCorrection() const override; + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const override; void correctDistortion(double &x, double &y, int cx, int cy) const override; - bool isCACorrectionAvailable() const override; void correctCA(double& x, double& y, int cx, int cy, int channel) const override; void processVignette(int width, int height, float** rawData) const override; void processVignette3Channels(int width, int height, float** rawData) const override; diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 505346ad0..f4714b6f7 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -102,6 +102,21 @@ LFModifier::operator bool() const } +bool LFModifier::hasDistortionCorrection() const +{ + return (flags_ & LF_MODIFY_DISTORTION); +} + +bool LFModifier::hasCACorrection() const +{ + return (flags_ & LF_MODIFY_TCA); +} + +bool LFModifier::hasVignettingCorrection() const +{ + return (flags_ & LF_MODIFY_VIGNETTING); +} + void LFModifier::correctDistortion(double &x, double &y, int cx, int cy) const { if (!data_) { @@ -125,11 +140,6 @@ void LFModifier::correctDistortion(double &x, double &y, int cx, int cy) const } } -bool LFModifier::isCACorrectionAvailable() const -{ - return (flags_ & LF_MODIFY_TCA); -} - void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) const { assert(channel >= 0 && channel <= 2); diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 39ca67ec2..78c9c9ff6 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -53,9 +53,12 @@ public: explicit operator bool() const; + bool hasDistortionCorrection() const override; + bool hasCACorrection() const override; + bool hasVignettingCorrection() const override; + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const override; void correctDistortion(double &x, double &y, int cx, int cy) const override; - bool isCACorrectionAvailable() const override; void correctCA(double &x, double &y, int cx, int cy, int channel) const override; void processVignette(int width, int height, float** rawData) const override; void processVignette3Channels(int width, int height, float** rawData) const override; From 5159de89cbb113e51dbeda546294f7cb5b65a6ab Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 09:42:15 +0200 Subject: [PATCH 71/78] imagedata: report if file is DNG --- rtengine/imagedata.cc | 7 +++++++ rtengine/imagedata.h | 2 ++ rtengine/rtengine.h | 2 ++ rtgui/cacheimagedata.cc | 6 ++++++ rtgui/cacheimagedata.h | 2 ++ 5 files changed, 19 insertions(+) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 6507a970d..45db99f1e 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -565,6 +565,8 @@ FramesData::FramesData(const Glib::ustring &fname, time_t ts) : meta.getDimensions(w_, h_); + isDNG = find_exif_tag("Exif.Image.DNGVersion"); + // ----------------------- // Special file type detection (HDR, PixelShift) // ------------------------ @@ -778,6 +780,11 @@ bool FramesData::getHDR() const return isHDR; } +bool FramesData::getDNG() const +{ + return isDNG; +} + std::string FramesData::getImageType() const { return isPixelShift ? "PS" : isHDR ? "HDR" : "STD"; diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index 08f55bd62..f999d59e6 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -59,6 +59,7 @@ private: time_t modTimeStamp; bool isPixelShift; bool isHDR; + bool isDNG; int w_; int h_; @@ -69,6 +70,7 @@ public: unsigned int getFrameCount() const override; bool getPixelShift() const override; bool getHDR() const override; + bool getDNG() const override; std::string getImageType() const override; IIOSampleFormat getSampleFormat() const override; bool hasExif() const override; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index f1ee4108c..0010f42b8 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -130,6 +130,8 @@ public: virtual bool getPixelShift () const = 0; /** @return false: not an HDR file ; true: single or multi-frame HDR file (e.g. Pentax HDR raw file or 32 bit float DNG file or Log compressed) */ virtual bool getHDR() const = 0; + /** @return true if the file is a DNG file */ + virtual bool getDNG() const = 0; /** @return false: not an HDR file ; true: single or multi-frame HDR file (e.g. Pentax HDR raw file or 32 bit float DNG file or Log compressed) */ virtual std::string getImageType() const = 0; diff --git a/rtgui/cacheimagedata.cc b/rtgui/cacheimagedata.cc index 0e9cc7f0f..872c60504 100644 --- a/rtgui/cacheimagedata.cc +++ b/rtgui/cacheimagedata.cc @@ -59,6 +59,7 @@ CacheImageData::CacheImageData() : iso(0), rating(0), isHDR (false), + isDNG (false), isPixelShift (false), sensortype(rtengine::ST_NONE), sampleFormat(rtengine::IIOSF_UNKNOWN), @@ -194,6 +195,10 @@ int CacheImageData::load (const Glib::ustring& fname) isHDR = keyFile.get_boolean ("ExifInfo", "IsHDR"); } + if (keyFile.has_key ("ExifInfo", "IsDNG")) { + isDNG = keyFile.get_boolean ("ExifInfo", "IsDNG"); + } + if (keyFile.has_key ("ExifInfo", "IsPixelShift")) { isPixelShift = keyFile.get_boolean ("ExifInfo", "IsPixelShift"); } @@ -316,6 +321,7 @@ int CacheImageData::save (const Glib::ustring& fname) keyFile.set_double ("ExifInfo", "FocusDist", focusDist); keyFile.set_integer ("ExifInfo", "ISO", iso); keyFile.set_boolean ("ExifInfo", "IsHDR", isHDR); + keyFile.set_boolean ("ExifInfo", "IsDNG", isDNG); keyFile.set_boolean ("ExifInfo", "IsPixelShift", isPixelShift); keyFile.set_string ("ExifInfo", "ExpComp", expcomp); } diff --git a/rtgui/cacheimagedata.h b/rtgui/cacheimagedata.h index 8c0fa6513..e3d5cc3da 100644 --- a/rtgui/cacheimagedata.h +++ b/rtgui/cacheimagedata.h @@ -60,6 +60,7 @@ public: unsigned iso; int rating; bool isHDR; + bool isDNG; bool isPixelShift; int sensortype; rtengine::IIO_Sample_Format sampleFormat; @@ -114,6 +115,7 @@ public: int getRating () const override { return rating; } // FIXME-piotr : missing rating bool getPixelShift () const override { return isPixelShift; } bool getHDR() const override { return isHDR; } + bool getDNG() const override { return isDNG; } std::string getImageType() const override { return isPixelShift ? "PS" : isHDR ? "HDR" : "STD"; } rtengine::IIOSampleFormat getSampleFormat() const override { return sampleFormat; } void getDimensions(int &w, int &h) const override From 2b97de233f330becff648c296daf009e3a6d1e07 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 09:51:08 +0200 Subject: [PATCH 72/78] Add initial metadata lens correction handling --- rtdata/languages/default | 1 + rtengine/CMakeLists.txt | 1 + rtengine/dcrop.cc | 2 +- rtengine/improcfun.h | 3 +- rtengine/iptransform.cc | 18 +++++- rtengine/lensmetadata.cc | 42 +++++++++++++ rtengine/lensmetadata.h | 47 +++++++++++++++ rtengine/procparams.cc | 8 ++- rtengine/procparams.h | 4 +- rtengine/rawimagesource.cc | 9 ++- rtgui/lensprofile.cc | 120 +++++++++++++++++++++++++++---------- rtgui/lensprofile.h | 6 +- 12 files changed, 222 insertions(+), 39 deletions(-) create mode 100644 rtengine/lensmetadata.cc create mode 100644 rtengine/lensmetadata.h diff --git a/rtdata/languages/default b/rtdata/languages/default index 46496826a..e6eb09b06 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2837,6 +2837,7 @@ TP_LENSGEOM_FILL;Auto-fill TP_LENSGEOM_LABEL;Lens / Geometry TP_LENSGEOM_LIN;Linear TP_LENSGEOM_LOG;Logarithmic +TP_LENSPROFILE_CORRECTION_METADATA;From file metadata TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 5d87310b9..c937198c8 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -148,6 +148,7 @@ set(RTENGINESOURCEFILES jpeg_ijg/jpeg_memsrc.cc labimage.cc lcp.cc + lensmetadata.cc lmmse_demosaic.cc loadinitial.cc metadata.cc diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 580475c37..e630d1936 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1850,7 +1850,7 @@ bool check_need_larger_crop_for_lcp_distortion(int fw, int fh, int x, int y, int return false; } - return (params.lensProf.useDist && (params.lensProf.useLensfun() || params.lensProf.useLcp())); + return (params.lensProf.useDist && (params.lensProf.useLensfun() || params.lensProf.useLcp() || params.lensProf.useMetadata())); } } // namespace diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 9c6c794f0..c8c6e166e 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -130,6 +130,7 @@ class ImProcFunctions bool needsGradient() const; bool needsVignetting() const; bool needsLCP() const; + bool needsMetadata() const; bool needsLensfun() const; // static cmsUInt8Number* Mempro = NULL; @@ -155,7 +156,7 @@ enum class BlurType { ~ImProcFunctions(); bool needsLuminanceOnly() const { - return !(needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient()); + return !(needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun() || needsMetadata()) && (needsVignetting() || needsPCVignetting() || needsGradient()); } void setScale(double iscale); diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 468507385..10f37e781 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -26,6 +26,7 @@ #include "rt_math.h" #include "rtengine.h" #include "rtlensfun.h" +#include "lensmetadata.h" #include "sleef.h" using namespace std; @@ -659,7 +660,13 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, std::unique_ptr pLCPMap; - if (needsLensfun()) { + if (needsMetadata()) { + auto corr = MetadataLensCorrectionFinder::findCorrection(metadata); + if (corr) { + corr->initCorrections(oW, oH, params->coarse, rawRotationDeg); + pLCPMap = std::move(corr); + } + } else if (needsLensfun()) { pLCPMap = LFDatabase::getInstance()->findModifier(params->lensProf, metadata, oW, oH, params->coarse, rawRotationDeg); } else if (needsLCP()) { // don't check focal length to allow distortion correction for lenses without chip const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile (params->lensProf.lcpFile); @@ -675,7 +682,7 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, } } - if (! (needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient())) { + if (! (needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsMetadata() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient())) { transformLuminanceOnly (original, transformed, cx, cy, oW, oH, fW, fH); } else { bool highQuality; @@ -1422,6 +1429,11 @@ bool ImProcFunctions::needsVignetting () const return params->vignetting.amount; } +bool ImProcFunctions::needsMetadata () const +{ + return params->lensProf.useMetadata(); +} + bool ImProcFunctions::needsLCP () const { return params->lensProf.useLcp(); @@ -1439,7 +1451,7 @@ bool ImProcFunctions::needsTransform (int oW, int oH, int rawRotationDeg, const std::unique_ptr pLCPMap = LFDatabase::getInstance()->findModifier(params->lensProf, metadata, oW, oH, params->coarse, rawRotationDeg); needsLf = pLCPMap.get(); } - return needsCA () || needsDistortion () || needsRotation () || needsPerspective () || needsGradient () || needsPCVignetting () || needsVignetting () || needsLCP() || needsLf; + return needsCA () || needsDistortion () || needsRotation () || needsPerspective () || needsGradient () || needsPCVignetting () || needsVignetting () || needsLCP() || needsMetadata() || needsLf; } diff --git a/rtengine/lensmetadata.cc b/rtengine/lensmetadata.cc new file mode 100644 index 000000000..e92fc6cc9 --- /dev/null +++ b/rtengine/lensmetadata.cc @@ -0,0 +1,42 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2024 Rawtherapee developers + * + * 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 + +#include "lensmetadata.h" + +namespace rtengine +{ + +std::unique_ptr MetadataLensCorrectionFinder::findCorrection(const FramesMetaData *meta) +{ + static const std::unordered_set makers = {}; + + std::string make = Glib::ustring(meta->getMake()).uppercase(); + + if (makers.find(make) == makers.end()) { + return nullptr; + } + + std::unique_ptr correction; + + return correction; +} + +} // namespace rtengine diff --git a/rtengine/lensmetadata.h b/rtengine/lensmetadata.h new file mode 100644 index 000000000..7991af8cd --- /dev/null +++ b/rtengine/lensmetadata.h @@ -0,0 +1,47 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2024 Rawtherapee developers + * + * 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 . + */ +#pragma once + +#include + +#include "lcp.h" +#include "metadata.h" +#include "procparams.h" +#include "rtengine.h" + +namespace rtengine +{ + +/* MetadataLensCorrection is an abstract class for various lens correction based on raw file metadata + this metadata is vendor dependent */ +class MetadataLensCorrection : public LensCorrection, + public NonCopyable +{ +public: + virtual void initCorrections(int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) = 0; +}; + +/* MetadataLensCorrectionFinder tries to find and return MetadataLensCorrection for the provided metadata */ +class MetadataLensCorrectionFinder +{ +public: + static std::unique_ptr findCorrection(const FramesMetaData *meta); +}; + +} // namespace rtengine diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index b868a7627..e1a56a533 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2064,13 +2064,19 @@ bool LensProfParams::lfManual() const return lcMode == LcMode::LENSFUNMANUAL; } +bool LensProfParams::useMetadata() const +{ + return lcMode == LcMode::METADATA; +} + const std::vector& LensProfParams::getMethodStrings() const { static const std::vector method_strings = { "none", "lfauto", "lfmanual", - "lcp" + "lcp", + "metadata" }; return method_strings; } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index d71c3d172..e6945cfbd 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -966,7 +966,8 @@ struct LensProfParams { NONE, // No lens correction LENSFUNAUTOMATCH, // Lens correction using auto matched lensfun database entry LENSFUNMANUAL, // Lens correction using manually selected lensfun database entry - LCP // Lens correction using lcp file + LCP, // Lens correction using lcp file + METADATA // Lens correction using embedded metadata }; LcMode lcMode; @@ -985,6 +986,7 @@ struct LensProfParams { bool lfAutoMatch() const; bool useLcp() const; bool lfManual() const; + bool useMetadata() const; const std::vector& getMethodStrings() const; Glib::ustring getMethodString(LcMode mode) const; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 09b64ad41..8cd6ffedd 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -44,6 +44,7 @@ #include "rt_math.h" #include "rtengine.h" #include "rtlensfun.h" +#include "lensmetadata.h" #include "../rtgui/options.h" #define BENCHMARK @@ -1583,7 +1584,13 @@ void RawImageSource::preprocess(const RAWParams &raw, const LensProfParams &lens if (!hasFlatField && lensProf.useVign && lensProf.lcMode != LensProfParams::LcMode::NONE) { std::unique_ptr pmap; - if (lensProf.useLensfun()) { + if (lensProf.useMetadata()) { + auto corr = MetadataLensCorrectionFinder::findCorrection(idata); + if (corr) { + corr->initCorrections(W, H, coarse, -1); + pmap = std::move(corr); + } + } else if (lensProf.useLensfun()) { pmap = LFDatabase::getInstance()->findModifier(lensProf, idata, W, H, coarse, -1); } else { const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile(lensProf.lcpFile); diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index 5f42a1cde..4410b2fe0 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -32,6 +32,7 @@ #include "../rtengine/lcp.h" #include "../rtengine/procparams.h" #include "../rtengine/rtlensfun.h" +#include "../rtengine/lensmetadata.h" using namespace rtengine; using namespace rtengine::procparams; @@ -56,6 +57,7 @@ LensProfilePanel::LensProfilePanel() : distGrid(Gtk::manage((new Gtk::Grid()))), corrUnchangedRB(Gtk::manage((new Gtk::RadioButton(M("GENERAL_UNCHANGED"))))), corrOffRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("GENERAL_NONE"))))), + corrMetadata(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_METADATA"))))), corrLensfunAutoRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_AUTOMATCH"))))), corrLensfunManualRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_MANUAL"))))), corrLcpFileRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_LCPFILE"))))), @@ -144,17 +146,18 @@ LensProfilePanel::LensProfilePanel() : // Populate modes grid: modesGrid->attach(*corrOffRB, 0, 0, 3, 1); - modesGrid->attach(*corrLensfunAutoRB, 0, 1, 3, 1); - modesGrid->attach(*corrLensfunManualRB, 0, 2, 3, 1); + modesGrid->attach(*corrMetadata, 0, 1, 3, 1); + modesGrid->attach(*corrLensfunAutoRB, 0, 2, 3, 1); + modesGrid->attach(*corrLensfunManualRB, 0, 3, 3, 1); - modesGrid->attach(*lensfunCamerasLbl, 0, 3, 1, 1); - modesGrid->attach(*lensfunCameras, 1, 3, 1, 1); - modesGrid->attach(*lensfunLensesLbl, 0, 4, 1, 1); - modesGrid->attach(*lensfunLenses, 1, 4, 1, 1); - modesGrid->attach(*warning, 2, 3, 1, 2); + modesGrid->attach(*lensfunCamerasLbl, 0, 4, 1, 1); + modesGrid->attach(*lensfunCameras, 1, 4, 1, 1); + modesGrid->attach(*lensfunLensesLbl, 0, 5, 1, 1); + modesGrid->attach(*lensfunLenses, 1, 5, 1, 1); + modesGrid->attach(*warning, 2, 4, 1, 2); - modesGrid->attach(*corrLcpFileRB, 0, 5, 1, 1); - modesGrid->attach(*corrLcpFileChooser, 1, 5, 1, 1); + modesGrid->attach(*corrLcpFileRB, 0, 6, 1, 1); + modesGrid->attach(*corrLcpFileChooser, 1, 6, 1, 1); // Populate distortions grid: @@ -179,6 +182,7 @@ LensProfilePanel::LensProfilePanel() : lensfunCameras->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunCameraChanged)); lensfunLenses->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunLensChanged)); corrOffRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrOffRB)); + corrMetadata->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrMetadata)); corrLensfunAutoRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunAutoRB)); corrLensfunManualRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunManualRB)); corrLcpFileRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLcpFileRB)); @@ -211,30 +215,52 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa break; } + case procparams::LensProfParams::LcMode::METADATA: { + if (metadata) { + auto metadataCorrection= rtengine::MetadataLensCorrectionFinder::findCorrection(metadata); + if (metadataCorrection) { + corrMetadata->set_active(true); + corrMetadata->set_sensitive(true); + } else { + corrMetadata->set_sensitive(false); + corrOffRB->set_active(true); + } + } else { + corrMetadata->set_sensitive(false); + } + break; + } + case procparams::LensProfParams::LcMode::NONE: { corrOffRB->set_active(true); setManualParamsVisibility(false); + + ckbUseDist->set_sensitive(false); + ckbUseVign->set_sensitive(false); + ckbUseCA->set_sensitive(false); break; } } - if (pp->lensProf.lcpFile.empty()) { - const Glib::ustring lastFolder = corrLcpFileChooser->get_current_folder(); - corrLcpFileChooser->set_current_folder(lastFolder); - corrLcpFileChooser->unselect_all(); - bindCurrentFolder(*corrLcpFileChooser, options.lastLensProfileDir); - updateDisabled(false); - } - else if (LCPStore::getInstance()->isValidLCPFileName(pp->lensProf.lcpFile)) { - corrLcpFileChooser->set_filename(pp->lensProf.lcpFile); - - if (corrLcpFileRB->get_active()) { - updateDisabled(true); + if (pp->lensProf.lcMode == procparams::LensProfParams::LcMode::LCP) { + if (pp->lensProf.lcpFile.empty()) { + const Glib::ustring lastFolder = corrLcpFileChooser->get_current_folder(); + corrLcpFileChooser->set_current_folder(lastFolder); + corrLcpFileChooser->unselect_all(); + bindCurrentFolder(*corrLcpFileChooser, options.lastLensProfileDir); + updateLCPDisabled(false); + } + else if (LCPStore::getInstance()->isValidLCPFileName(pp->lensProf.lcpFile)) { + corrLcpFileChooser->set_filename(pp->lensProf.lcpFile); + + if (corrLcpFileRB->get_active()) { + updateLCPDisabled(true); + } + } + else { + corrLcpFileChooser->unselect_filename(corrLcpFileChooser->get_filename()); + updateLCPDisabled(false); } - } - else { - corrLcpFileChooser->unselect_filename(corrLcpFileChooser->get_filename()); - updateDisabled(false); } const LFDatabase* const db = LFDatabase::getInstance(); @@ -308,6 +334,9 @@ void LensProfilePanel::write(rtengine::procparams::ProcParams* pp, ParamsEdited* if (corrLcpFileRB->get_active()) { pp->lensProf.lcMode = procparams::LensProfParams::LcMode::LCP; } + else if (corrMetadata->get_active()) { + pp->lensProf.lcMode = procparams::LensProfParams::LcMode::METADATA; + } else if (corrLensfunManualRB->get_active()) { pp->lensProf.lcMode = procparams::LensProfParams::LcMode::LENSFUNMANUAL; } @@ -367,12 +396,18 @@ void LensProfilePanel::setRawMeta(bool raw, const rtengine::FramesMetaData* pMet // CA is very focus layer dependent, otherwise it might even worsen things allowFocusDep = false; - ckbUseCA->set_active(false); - ckbUseCA->set_sensitive(false); enableListener(); } + corrMetadata->set_sensitive(false); + if (pMeta) { + metadataCorrection = MetadataLensCorrectionFinder::findCorrection(pMeta); + if (metadataCorrection) { + corrMetadata->set_sensitive(true); + } + } + isRaw = raw; metadata = pMeta; } @@ -381,7 +416,7 @@ void LensProfilePanel::onLCPFileChanged() { lcpFileChanged = true; const bool valid = LCPStore::getInstance()->isValidLCPFileName(corrLcpFileChooser->get_filename()); - updateDisabled(valid); + updateLCPDisabled(valid); if (listener) { if (valid) { @@ -552,10 +587,20 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) lensfunAutoChanged = true; lcpFileChanged = true; - updateDisabled(true); + updateLCPDisabled(true); mode = M("TP_LENSPROFILE_CORRECTION_LCPFILE"); + } else if (rbChanged == corrMetadata) { + lcModeChanged = true; + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; + + updateMetadataDisabled(); + + mode = M("TP_LENSPROFILE_CORRECTION_METADATA"); + } else if (rbChanged == corrUnchangedRB) { lcModeChanged = false; useLensfunChanged = false; @@ -680,7 +725,7 @@ void LensProfilePanel::LFDbHelper::fillLensfunLenses() } } -void LensProfilePanel::updateDisabled(bool enable) +void LensProfilePanel::updateLCPDisabled(bool enable) { if (!batchMode) { ckbUseDist->set_sensitive(enable); @@ -689,6 +734,21 @@ void LensProfilePanel::updateDisabled(bool enable) } } +void LensProfilePanel::updateMetadataDisabled() +{ + if (!batchMode) { + if (metadataCorrection) { + ckbUseDist->set_sensitive(metadataCorrection->hasDistortionCorrection()); + ckbUseVign->set_sensitive(metadataCorrection->hasVignettingCorrection()); + ckbUseCA->set_sensitive(metadataCorrection->hasCACorrection()); + } else { + ckbUseDist->set_sensitive(false); + ckbUseVign->set_sensitive(false); + ckbUseCA->set_sensitive(false); + } + } +} + bool LensProfilePanel::setLensfunCamera(const Glib::ustring& make, const Glib::ustring& model) { if (!make.empty() && !model.empty()) { diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index 42746f41e..cdf7bd6e4 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -22,6 +22,7 @@ #include "guiutils.h" #include "toolpanel.h" +#include "../rtengine/lensmetadata.h" class LensProfilePanel final : public ToolParamBlock, @@ -89,7 +90,8 @@ private: void fillLensfunLenses(); }; - void updateDisabled(bool enable); + void updateLCPDisabled(bool enable); + void updateMetadataDisabled(); bool setLensfunCamera(const Glib::ustring& make, const Glib::ustring& model); bool setLensfunLens(const Glib::ustring& lens); @@ -113,12 +115,14 @@ private: bool allowFocusDep; bool isRaw; const rtengine::FramesMetaData* metadata; + std::unique_ptr metadataCorrection; Gtk::Grid* const modesGrid; Gtk::Grid* const distGrid; Gtk::RadioButton* const corrUnchangedRB; Gtk::RadioButton::Group corrGroup; Gtk::RadioButton* const corrOffRB; + Gtk::RadioButton* const corrMetadata; Gtk::RadioButton* const corrLensfunAutoRB; Gtk::RadioButton* const corrLensfunManualRB; Gtk::RadioButton* const corrLcpFileRB; From f64ad13363c340815b67fe74119189126536f40c Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 20:23:25 +0200 Subject: [PATCH 73/78] lensmetadata: add abstract center radius helper class Add a CenterRadiusMetadataLensCorrection helper class that will be implemented by vendor specific corrections based on center radius. --- rtengine/lensmetadata.cc | 108 +++++++++++++++++++++++++++++++++++++++ rtengine/lensmetadata.h | 42 +++++++++++++++ 2 files changed, 150 insertions(+) diff --git a/rtengine/lensmetadata.cc b/rtengine/lensmetadata.cc index e92fc6cc9..c531de65b 100644 --- a/rtengine/lensmetadata.cc +++ b/rtengine/lensmetadata.cc @@ -24,6 +24,114 @@ namespace rtengine { +CenterRadiusMetadataLensCorrection::CenterRadiusMetadataLensCorrection(const FramesMetaData *meta) : + swap_xy(false) +{ + metadata = Exiv2Metadata(meta->getFileName()); + metadata.load(); +} + +void CenterRadiusMetadataLensCorrection::initCorrections(int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) +{ + if (rawRotationDeg >= 0) { + int rot = (coarse.rotate + rawRotationDeg) % 360; + swap_xy = (rot == 90 || rot == 270); + if (swap_xy) { + std::swap(width, height); + } + } + + w2 = width * 0.5f; + h2 = height * 0.5f; + rf = 1 / std::sqrt(SQR(w2) + SQR(h2)); +} + +void CenterRadiusMetadataLensCorrection::process(double &x, double &y, int cx, int cy, int channel, bool dist, bool ca) const +{ + double xx = x + cx; + double yy = y + cy; + if (swap_xy) { + std::swap(xx, yy); + } + + double xc = xx - w2; + double yc = yy - h2; + + double rout = rf * std::sqrt(SQR(xc) + SQR(yc)); + double cf = 1; + if (dist && ca) { + cf = distortionAndCACorrectionFactor(rout, channel); + } else if (dist) { + cf = distortionCorrectionFactor(rout); + } else if (ca) { + cf = caCorrectionFactor(rout, channel); + } + + x = cf * xc + w2; + y = cf * yc + h2; + + if (swap_xy) { + std::swap(x, y); + } + x -= cx; + y -= cy; +} + +void CenterRadiusMetadataLensCorrection::correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const +{ + if (!hasDistortionCorrection() || !hasCACorrection()) { + return; + } + + process(x, y, cx, cy, channel, true, true); +} + +void CenterRadiusMetadataLensCorrection::correctDistortion(double &x, double &y, int cx, int cy) const +{ + if (!hasDistortionCorrection()) { + return; + } + + process(x, y, cx, cy, 1, true, false); +} + +void CenterRadiusMetadataLensCorrection::correctCA(double &x, double &y, int cx, int cy, int channel) const +{ + if (!hasCACorrection()) { + return; + } + + process(x, y, cx, cy, channel, false, true); +} + +void CenterRadiusMetadataLensCorrection::processVignetteNChannels(int width, int height, float **rawData, int channels) const +{ + if (!hasVignettingCorrection()) { + return; + } + + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + double xc = x - w2; + double yc = y - h2; + double sf = vignettingCorrectionFactor(rf * std::sqrt(SQR(xc) + SQR(yc))); + for (int c = 0; c < channels; c++) { + rawData[y][x + c] *= sf; + } + } + } +} + +void CenterRadiusMetadataLensCorrection::processVignette(int width, int height, float **rawData) const +{ + return processVignetteNChannels(width, height, rawData, 1); +} + +void CenterRadiusMetadataLensCorrection::processVignette3Channels(int width, int height, float **rawData) const +{ + return processVignetteNChannels(width, height, rawData, 3); +} + std::unique_ptr MetadataLensCorrectionFinder::findCorrection(const FramesMetaData *meta) { static const std::unordered_set makers = {}; diff --git a/rtengine/lensmetadata.h b/rtengine/lensmetadata.h index 7991af8cd..ac042b7ce 100644 --- a/rtengine/lensmetadata.h +++ b/rtengine/lensmetadata.h @@ -37,6 +37,48 @@ public: virtual void initCorrections(int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) = 0; }; +/* CenterRadiusMetadataLensCorrection is an abstract class the extends MetadataLensCorrection to easily handle center radius based corrections */ +class CenterRadiusMetadataLensCorrection : public MetadataLensCorrection +{ +public: + CenterRadiusMetadataLensCorrection(const FramesMetaData *meta); + + void process(double &x, double &y, int cx, int cy, int channel, bool dist, bool ca) const; + + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const override; + void correctDistortion(double &x, double &y, int cx, int cy) const override; + void correctCA(double &x, double &y, int cx, int cy, int channel) const override; + void processVignette(int width, int height, float **rawData) const override; + void processVignette3Channels(int width, int height, float **rawData) const override; + + void processVignetteNChannels(int width, int height, float **rawData, int channels) const; + void initCorrections(int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) override; + + /* Implementers should implement the below methods */ + virtual bool hasDistortionCorrection() const override = 0; + virtual bool hasCACorrection() const override = 0; + virtual bool hasVignettingCorrection() const override = 0; + + /* These methods should return the distortion correction factor (cf) for the + * provided radius rout (radius of the output image (corrected)). + * So rin = rout * cf + * */ + virtual double distortionCorrectionFactor(double rout) const = 0; + virtual double caCorrectionFactor(double rout, int channel) const = 0; + virtual double distortionAndCACorrectionFactor(double rout, int channel) const = 0; + + /* This methods should return the vignetting correction factor (cf) for the + * provided radius */ + virtual double vignettingCorrectionFactor(double r) const = 0; + +protected: + bool swap_xy; + double w2; + double h2; + double rf; + Exiv2Metadata metadata; +}; + /* MetadataLensCorrectionFinder tries to find and return MetadataLensCorrection for the provided metadata */ class MetadataLensCorrectionFinder { From 27dc084e81b3145eae103919a2395d3d25b0c036 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 20:26:22 +0200 Subject: [PATCH 74/78] Add Sony metadata lens correction --- rtengine/lensmetadata.cc | 163 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 162 insertions(+), 1 deletion(-) diff --git a/rtengine/lensmetadata.cc b/rtengine/lensmetadata.cc index c531de65b..0e8156f39 100644 --- a/rtengine/lensmetadata.cc +++ b/rtengine/lensmetadata.cc @@ -24,6 +24,31 @@ namespace rtengine { +namespace +{ + +/* interpolateLinearSpline does a simple linear spline interpolation. Values + * outside the external knots will return the value of the nearest knot without + * any additional interpolation. */ +double interpolateLinearSpline(const std::vector &xi, const std::vector &yi, double x) +{ + if (x < xi[0]) { + return yi[0]; + } + + for (size_t i = 1; i < xi.size(); i++) { + if (x >= xi[i - 1] && x <= xi[i]) { + double dydx = (yi[i] - yi[i - 1]) / (xi[i] - xi[i - 1]); + + return yi[i - 1] + (x - xi[i - 1]) * dydx; + } + } + + return yi[yi.size() - 1]; +} + +} // namespace + CenterRadiusMetadataLensCorrection::CenterRadiusMetadataLensCorrection(const FramesMetaData *meta) : swap_xy(false) { @@ -132,9 +157,133 @@ void CenterRadiusMetadataLensCorrection::processVignette3Channels(int width, int return processVignetteNChannels(width, height, rawData, 3); } +/* Fuji, Sony, Olympus metadata handling and algorithms adapted from + * - src/iop/lens.cc + * - src/common/exif.cc + * in darktable 4.6 */ +/* + This file is part of darktable, + Copyright (C) 2019-2024 darktable developers. + + darktable 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. + + darktable 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 darktable. If not, see . +*/ + +class SonyMetadataLensCorrection : public CenterRadiusMetadataLensCorrection +{ +public: + SonyMetadataLensCorrection(const FramesMetaData *meta) : + CenterRadiusMetadataLensCorrection(meta) + { + parse(); + setup(); + } + +private: + int nc; + std::array distortion; + std::array ca_r; + std::array ca_b; + std::array vignetting; + + std::vector knots; + std::vector dist; + std::array, 3> ca; + std::vector vig; + + void parse() + { + if (Exiv2::versionNumber() < EXIV2_MAKE_VERSION(0, 27, 4)) { + throw std::runtime_error("cannot get Sony correction data, too old exiv2 version " + Exiv2::versionString()); + } + + auto &exif = metadata.exifData(); + + auto posd = exif.findKey(Exiv2::ExifKey("Exif.SubImage1.DistortionCorrParams")); + auto posc = exif.findKey(Exiv2::ExifKey("Exif.SubImage1.ChromaticAberrationCorrParams")); + auto posv = exif.findKey(Exiv2::ExifKey("Exif.SubImage1.VignettingCorrParams")); + + /* Sony metadata corrections parameters define some splines with N knots */ + if (posd == exif.end() || posc == exif.end() || posv == exif.end()) { + throw std::runtime_error("cannot get Sony correction data"); + } + + const int nc = to_long(posd); + if (nc <= 16 && 2 * nc == to_long(posc) && nc == to_long(posv)) { + this->nc = nc; + for (int i = 0; i < nc; i++) { + distortion[i] = to_long(posd, i + 1); + ca_r[i] = to_long(posc, i + 1); + ca_b[i] = to_long(posc, nc + i + 1); + vignetting[i] = to_long(posv, i + 1); + } + } else { + throw std::runtime_error("cannot get Sony correction data"); + } + } + + void setup() + { + knots.resize(nc); + dist.resize(nc); + vig.resize(nc); + for (int i = 0; i < 3; ++i) { + ca[i].resize(nc); + } + + for (int i = 0; i < this->nc; i++) { + knots[i] = (i + 0.5) / (nc - 1); + + dist[i] = distortion[i] * powf(2, -14) + 1; + + ca[0][i] = ca[1][i] = ca[2][i] = 1.f; + ca[0][i] *= ca_r[i] * powf(2, -21) + 1; + ca[2][i] *= ca_b[i] * powf(2, -21) + 1; + + vig[i] = 1 / powf(2, 0.5f - powf(2, vignetting[i] * powf(2, -13) - 1)); + } + } + + double distortionCorrectionFactor(double rout) const override + { + return interpolateLinearSpline(knots, dist, rout); + } + + double caCorrectionFactor(double rout, int channel) const override + { + return interpolateLinearSpline(knots, ca[channel], rout); + } + + double distortionAndCACorrectionFactor(double rout, int channel) const override + { + return distortionCorrectionFactor(rout) * caCorrectionFactor(rout, channel); + } + + double vignettingCorrectionFactor(double r) const override + { + return interpolateLinearSpline(knots, vig, r); + } + + bool hasDistortionCorrection() const override { return true; } + bool hasVignettingCorrection() const override { return true; } + bool hasCACorrection() const override { return true; } +}; + std::unique_ptr MetadataLensCorrectionFinder::findCorrection(const FramesMetaData *meta) { - static const std::unordered_set makers = {}; + static const std::unordered_set makers = { + "SONY", + }; std::string make = Glib::ustring(meta->getMake()).uppercase(); @@ -144,6 +293,18 @@ std::unique_ptr MetadataLensCorrectionFinder::findCorrec std::unique_ptr correction; + try { + if (make == "SONY") { + correction.reset(new SonyMetadataLensCorrection(meta)); + } + } catch (std::exception &exc) { + if (settings->verbose) { + std::cerr << "error parsing lens metadata: " << exc.what() << std::endl; + } + + correction.reset(nullptr); + } + return correction; } From b570c70f5b47233e3a3b8d99ac0502041a5692a4 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 20:27:16 +0200 Subject: [PATCH 75/78] Add Fujifilm metadata lens correction --- rtengine/lensmetadata.cc | 207 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) diff --git a/rtengine/lensmetadata.cc b/rtengine/lensmetadata.cc index 0e8156f39..006976371 100644 --- a/rtengine/lensmetadata.cc +++ b/rtengine/lensmetadata.cc @@ -279,10 +279,215 @@ private: bool hasCACorrection() const override { return true; } }; +class FujiMetadataLensCorrection : public CenterRadiusMetadataLensCorrection +{ +public: + FujiMetadataLensCorrection(const FramesMetaData *meta) : + CenterRadiusMetadataLensCorrection(meta) + { + parse(); + setup(); + } + +private: + const static int MAXKNOTS = 16; + + int nc; + double cropf; + + std::array fuji_knots; + std::array fuji_distortion; + std::array fuji_ca_r; + std::array fuji_ca_b; + std::array fuji_vignetting; + + std::vector knots_dist; + std::vector dist; + std::array, 3> ca; + std::vector knots_vig; + std::vector vig; + + void parse() + { + if (Exiv2::versionNumber() < EXIV2_MAKE_VERSION(0, 27, 4)) { + throw std::runtime_error("cannot get Fuji correction data, too old exiv2 version " + Exiv2::versionString()); + } + + auto &exif = metadata.exifData(); + + /* FujiFilm metadata corrections parameters define some splines with N knots */ + auto posd = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.GeometricDistortionParams")); + auto posc = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.ChromaticAberrationParams")); + auto posv = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.VignettingParams")); + + // X-Trans IV/V + if (posd != exif.end() && posc != exif.end() && posv != exif.end() && + posd->count() == 19 && posc->count() == 29 && posv->count() == 19) { + const int nc = 9; + this->nc = nc; + + for (int i = 0; i < nc; i++) { + const float kd = posd->toFloat(i + 1); + const float kc = posc->toFloat(i + 1); + const float kv = posv->toFloat(i + 1); + + // Check that the knots position is the same for distortion, ca and vignetting, + if (kd != kc || kd != kv) { + throw std::runtime_error("cannot get Fuji correction data: unexpected data"); + } + + fuji_knots[i] = kd; + fuji_distortion[i] = posd->toFloat(i + 10); + fuji_ca_r[i] = posc->toFloat(i + 10); + fuji_ca_b[i] = posc->toFloat(i + 19); + fuji_vignetting[i] = posv->toFloat(i + 10); + } + + // Account for the 1.25x crop modes in some Fuji cameras + auto it = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.CropMode")); + + if (it != exif.end() && (to_long(it) == 2 || to_long(it) == 4)) { + cropf = 1.25f; + } else { + cropf = 1; + } + } + // X-Trans I/II/III + else if (posd != exif.end() && posc != exif.end() && posv != exif.end() && + posd->count() == 23 && posc->count() == 31 && posv->count() == 23) { + const int nc = 11; + this->nc = nc; + + for (int i = 0; i < nc; i++) { + const float kd = posd->toFloat(i + 1); + float kc = 0; + // ca data doesn't provide first knot (0) + if (i != 0) kc = posc->toFloat(i); + const float kv = posv->toFloat(i + 1); + // check that the knots position is the same for distortion, ca and vignetting, + if (kd != kc || kd != kv) { + throw std::runtime_error("cannot get Fuji correction data: unexpected data"); + } + + fuji_knots[i] = kd; + fuji_distortion[i] = posd->toFloat(i + 12); + + // ca data doesn't provide first knot (0) + if (i == 0) { + fuji_ca_r[i] = 0; + fuji_ca_b[i] = 0; + } else { + fuji_ca_r[i] = posc->toFloat(i + 10); + fuji_ca_b[i] = posc->toFloat(i + 20); + } + fuji_vignetting[i] = posv->toFloat(i + 12); + } + + // Account for the 1.25x crop modes in some Fuji cameras + auto it = exif.findKey(Exiv2::ExifKey("Exif.Fujifilm.CropMode")); + + if (it != exif.end() && (to_long(it) == 2 || to_long(it) == 4)) { + cropf = 1.25f; + } else { + cropf = 1; + } + } else { + throw std::runtime_error("cannot get Fuji correction data"); + } + } + + void setup() + { + std::vector knots_in; + std::vector distortion_in; + std::vector ca_r_in; + std::vector ca_b_in; + + // add a knot with no corrections at 0 value if not existing + int size = nc; + if (fuji_knots[0] > 0.f) { + knots_in.push_back(0); + distortion_in.push_back(1); + ca_r_in.push_back(0); + ca_b_in.push_back(0); + + knots_vig.push_back(0); + vig.push_back(1); + + size++; + } + + knots_in.reserve(size); + vig.reserve(size); + + for (int i = 0; i < nc; i++) { + knots_in.push_back(cropf * fuji_knots[i]); + distortion_in.push_back(fuji_distortion[i] / 100 + 1); + ca_r_in.push_back(fuji_ca_r[i]); + ca_b_in.push_back(fuji_ca_b[i]); + + // vignetting correction is applied before distortion correction. So the + // spline is related to the source image before distortion. + knots_vig.push_back(cropf * fuji_knots[i]); + + vig.push_back(100 / fuji_vignetting[i]); + } + + knots_dist.resize(MAXKNOTS); + dist.resize(MAXKNOTS); + for (int i = 0; i < 3; ++i) { + ca[i].resize(MAXKNOTS); + } + + // convert from spline related to source image (input is source image + // radius) to spline related to dest image (input is dest image radius) + for (int i = 0; i < MAXKNOTS; i++) { + const double rin = static_cast(i) / static_cast(nc - 1); + const double m = interpolateLinearSpline(knots_in, distortion_in, rin); + const double r = rin / m; + knots_dist[i] = r; + + dist[i] = m; + + const double mcar = interpolateLinearSpline(knots_in, ca_r_in, rin); + const double mcab = interpolateLinearSpline(knots_in, ca_b_in, rin); + + ca[0][i] = ca[1][i] = ca[2][i] = 1.f; + ca[0][i] *= mcar + 1; + ca[2][i] *= mcab + 1; + } + } + + double distortionCorrectionFactor(double rout) const override + { + return interpolateLinearSpline(knots_dist, dist, rout); + } + + double caCorrectionFactor(double rout, int channel) const override + { + return interpolateLinearSpline(knots_dist, ca[channel], rout); + } + + double distortionAndCACorrectionFactor(double rout, int channel) const override + { + return distortionCorrectionFactor(rout) * caCorrectionFactor(rout, channel); + } + + double vignettingCorrectionFactor(double r) const override + { + return interpolateLinearSpline(knots_vig, vig, r); + } + + bool hasDistortionCorrection() const override { return true; } + bool hasVignettingCorrection() const override { return true; } + bool hasCACorrection() const override { return true; } +}; + std::unique_ptr MetadataLensCorrectionFinder::findCorrection(const FramesMetaData *meta) { static const std::unordered_set makers = { "SONY", + "FUJIFILM", }; std::string make = Glib::ustring(meta->getMake()).uppercase(); @@ -296,6 +501,8 @@ std::unique_ptr MetadataLensCorrectionFinder::findCorrec try { if (make == "SONY") { correction.reset(new SonyMetadataLensCorrection(meta)); + } else if (make == "FUJIFILM") { + correction.reset(new FujiMetadataLensCorrection(meta)); } } catch (std::exception &exc) { if (settings->verbose) { From 3189efddceb1d28b5b619caec56527ecacc5a974 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 20:28:19 +0200 Subject: [PATCH 76/78] Add Olympus metadata lens correction --- rtengine/lensmetadata.cc | 131 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/rtengine/lensmetadata.cc b/rtengine/lensmetadata.cc index 006976371..91adadd8a 100644 --- a/rtengine/lensmetadata.cc +++ b/rtengine/lensmetadata.cc @@ -483,11 +483,140 @@ private: bool hasCACorrection() const override { return true; } }; +class OlympusMetadataLensCorrection : public CenterRadiusMetadataLensCorrection +{ +public: + OlympusMetadataLensCorrection(const FramesMetaData *meta) : + CenterRadiusMetadataLensCorrection(meta), has_dist(false), has_ca(false) + { + parse(); + } + +private: + bool has_dist, has_ca; + + double drs; + double dk2; + double dk4; + double dk6; + + double car0; + double car2; + double car4; + double cab0; + double cab2; + double cab4; + + void parse() + { + if (Exiv2::versionNumber() < EXIV2_MAKE_VERSION(0, 27, 4)) { + throw std::runtime_error("cannot get Olympus correction data, too old exiv2 version " + Exiv2::versionString()); + } + + auto &exif = metadata.exifData(); + + std::array distortion; + std::array cacorr; + + auto it = exif.findKey(Exiv2::ExifKey("Exif.OlympusIp.0x150a")); + if (it != exif.end() && it->count() == 4) { + for (int i = 0; i < 4; ++i) { + distortion[i] = it->toFloat(i); + } + has_dist = true; + } + + it = exif.findKey(Exiv2::ExifKey("Exif.OlympusIp.0x150c")); + if (it != exif.end() && it->count() == 6) { + for (int i = 0; i < 6; ++i) { + cacorr[i] = it->toFloat(i); + } + has_ca = true; + } + + if (has_dist) { + drs = distortion[3]; + dk2 = distortion[0]; + dk4 = distortion[1]; + dk6 = distortion[2]; + } + + if (has_ca) { + car0 = cacorr[0]; + car2 = cacorr[1]; + car4 = cacorr[2]; + cab0 = cacorr[3]; + cab2 = cacorr[4]; + cab4 = cacorr[5]; + } + + if (!has_dist && !has_ca) { + throw std::runtime_error("no Olympus correction data"); + } + } + + double distortionCorrectionFactor(double rout) const override + { + // The distortion polynomial maps a radius Rout in the output + // (undistorted) image, where the corner is defined as Rout=1, to a + // radius in the input (distorted) image, where the corner is defined + // as Rin=1. + // Rin = Rout*drs * (1 + dk2 * (Rout*drs)^2 + dk4 * (Rout*drs)^4 + dk6 * (Rout*drs)^6) + // + // cf is Rin / Rout. + + const double rs2 = std::pow(rout * drs, 2); + const double cf = drs * (1 + rs2 * (dk2 + rs2 * (dk4 + rs2 * dk6))); + + return cf; + } + + double caCorrectionFactor(double rout, int channel) const override + { + // ca corrects only red and blue channel + if (channel != 0 && channel != 2) return 1; + + // CA correction is applied as: + // Rin = Rout * ((1 + car0) + car2 * Rout^2 + car4 * Rout^4) + // + // cf is Rin / Rout. + + const double r2 = powf(rout, 2); + if (channel == 0) { + return 1 + (car0 + r2 * (car2 + r2 * car4)); + } else if (channel == 2) { + return 1 + (cab0 + r2 * (cab2 + r2 * cab4)); + } + + return 1; + } + + double distortionAndCACorrectionFactor(double rout, int channel) const override + { + return distortionCorrectionFactor(rout) * caCorrectionFactor(rout, channel); + } + + double vignettingCorrectionFactor(double r) const override + { + return 1; + } + + bool hasDistortionCorrection() const override { return has_dist; } + // Olympus cameras have a shading correction option that fixes vignetting + // already in the raw file. Looks like they don't report vignetting + // correction parameters inside metadata even if shading correction is + // disabled. + bool hasVignettingCorrection() const override { return false; } + bool hasCACorrection() const override { return has_ca; } +}; + std::unique_ptr MetadataLensCorrectionFinder::findCorrection(const FramesMetaData *meta) { static const std::unordered_set makers = { "SONY", "FUJIFILM", + "OLYMPUS", + "OM DIGITAL SOLUTIONS", }; std::string make = Glib::ustring(meta->getMake()).uppercase(); @@ -503,6 +632,8 @@ std::unique_ptr MetadataLensCorrectionFinder::findCorrec correction.reset(new SonyMetadataLensCorrection(meta)); } else if (make == "FUJIFILM") { correction.reset(new FujiMetadataLensCorrection(meta)); + } else if (make == "OLYMPUS" || make == "OM DIGITAL SOLUTIONS") { + correction.reset(new OlympusMetadataLensCorrection(meta)); } } catch (std::exception &exc) { if (settings->verbose) { From c589e9d469cb41bfc24f39051735647d315d0d29 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 20:29:07 +0200 Subject: [PATCH 77/78] Add Panasonic metadata lens correction --- rtengine/lensmetadata.cc | 92 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/rtengine/lensmetadata.cc b/rtengine/lensmetadata.cc index 91adadd8a..f6b7e7331 100644 --- a/rtengine/lensmetadata.cc +++ b/rtengine/lensmetadata.cc @@ -610,6 +610,95 @@ private: bool hasCACorrection() const override { return has_ca; } }; +/* Panasonic metadata lens correction + * Currently disabled since the algorithm is not stable and works well with only some lenses. + * + * Data extraction and distortion correction formula from: + * https://web.archive.org/web/20120701131817/https://syscall.eu/#pana + * + * TODO(sgotti) + * * CA corrections not yet reverse engineered. + * * From a post on the exiftool forum: + * https://exiftool.org/forum/index.php?topic=9366.0 + * looks like there's another additional tag that provides similar data and it's + * used by newer cameras. + */ +class PanasonicMetadataLensCorrection : public CenterRadiusMetadataLensCorrection +{ +public: + PanasonicMetadataLensCorrection(const FramesMetaData *meta) : + CenterRadiusMetadataLensCorrection(meta), has_dist(false), a(0), b(0), c(0) + { + // Currently disabled since the algorithm is not stable and works well with only some lenses. + throw std::runtime_error("panasonic correction disabled as it's not yet working properly"); + + // parse(); + } + +private: + bool has_dist; + double scale, a, b, c; + + void parse() + { + if (Exiv2::versionNumber() < EXIV2_MAKE_VERSION(0, 27, 4)) { + throw std::runtime_error("cannot get Panasonic correction data, too old exiv2 version " + Exiv2::versionString()); + } + + auto &exif = metadata.exifData(); + + auto it = exif.findKey(Exiv2::ExifKey("Exif.PanasonicRaw.0x0119")); + if (it != exif.end()) { + std::vector buf; + buf.resize(it->value().size()); + it->value().copy(buf.data(), Exiv2::littleEndian); + + const Exiv2::byte *data = buf.data(); + // n is currently unused + // uint32_t n = Exiv2::getShort(data + 24, Exiv2::littleEndian); + scale = 1.0f / (1.0f + Exiv2::getShort(data + 10, Exiv2::littleEndian) / 32768.0f); + a = Exiv2::getShort(data + 16, Exiv2::littleEndian) / 32768.0f; + b = Exiv2::getShort(data + 8, Exiv2::littleEndian) / 32768.0f; + c = Exiv2::getShort(data + 22, Exiv2::littleEndian) / 32768.0f; + + has_dist = true; + } + } + + double distortionCorrectionFactor(double rout) const override + { + const double rs2 = std::pow(rout, 2); + + const double rin = scale * rout * (1 + rs2 * (a + rs2 * (b + rs2 * c))); + const double cf = rout / rin; + + return cf; + } + + double caCorrectionFactor(double rout, int channel) const override + { + return 1; + } + + double distortionAndCACorrectionFactor(double rout, int channel) const override + { + return distortionCorrectionFactor(rout); + } + + double vignettingCorrectionFactor(double r) const override + { + return 1; + } + + bool hasDistortionCorrection() const override { return has_dist; } + // Panasonic cameras have a shading correction option that fixes vignetting + // already in the raw file. Looks like they don't report vignetting + // correction parameters inside metadata even if shading correction is + // disabled. + bool hasVignettingCorrection() const override { return false; } + bool hasCACorrection() const override { return false; } +}; + std::unique_ptr MetadataLensCorrectionFinder::findCorrection(const FramesMetaData *meta) { static const std::unordered_set makers = { @@ -617,6 +706,7 @@ std::unique_ptr MetadataLensCorrectionFinder::findCorrec "FUJIFILM", "OLYMPUS", "OM DIGITAL SOLUTIONS", + "PANASONIC", }; std::string make = Glib::ustring(meta->getMake()).uppercase(); @@ -634,6 +724,8 @@ std::unique_ptr MetadataLensCorrectionFinder::findCorrec correction.reset(new FujiMetadataLensCorrection(meta)); } else if (make == "OLYMPUS" || make == "OM DIGITAL SOLUTIONS") { correction.reset(new OlympusMetadataLensCorrection(meta)); + } else if (make == "PANASONIC") { + correction.reset(new PanasonicMetadataLensCorrection(meta)); } } catch (std::exception &exc) { if (settings->verbose) { From 7deb2754d1f31beff891063b476905d4093e8570 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Thu, 13 Jun 2024 20:29:30 +0200 Subject: [PATCH 78/78] Add DNG metadata lens correction --- rtengine/lensmetadata.cc | 306 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 304 insertions(+), 2 deletions(-) diff --git a/rtengine/lensmetadata.cc b/rtengine/lensmetadata.cc index f6b7e7331..89a1ab13b 100644 --- a/rtengine/lensmetadata.cc +++ b/rtengine/lensmetadata.cc @@ -699,6 +699,306 @@ private: bool hasCACorrection() const override { return false; } }; +// Class DNGMetadatalensCorrection handles OpcodeList3 operations: operations to +// be done after demosaicing. +// OpcodeList1 is already handled by rawimagesource.cc. OpcodeList2 is not yet +// handled by rawtherapee. +// TODO(sgotti): dng spec provides clear rules on how and when to process the +// various opcodeList1/2/3 and the order of the various operations that should +// be done. +// Currently we only handle a subset of all the available opcodes and only one +// WarpRectilinar for distortion and FixVignetteRadial for vignetting (that's +// usually the case with Leica DNGs and ADC generated DNGs). +// This should be extended to support more exotic operations lists (i.e. +// multiple WarpRectilinear) +class DNGMetadataLensCorrection : public MetadataLensCorrection +{ +public: + DNGMetadataLensCorrection(const FramesMetaData *meta) : + MetadataLensCorrection(), swap_xy(false) + { + metadata = Exiv2Metadata(meta->getFileName()); + metadata.load(); + + parse(); + } + +private: + Exiv2Metadata metadata; + + bool swap_xy; + int width, height; + + double crx_d; + double cry_d; + double crx_v; + double cry_v; + + double cx_d; + double cy_d; + double m_v; + + double cx_v; + double cy_v; + double m_d; + + int planes; + + bool has_dist, has_ca, has_vign; + std::array, 3> warp_rectilinear; + std::array vignette_radial; + + void initCorrections(int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) override + { + if (rawRotationDeg >= 0) { + int rot = (coarse.rotate + rawRotationDeg) % 360; + swap_xy = (rot == 90 || rot == 270); + if (swap_xy) { + std::swap(width, height); + } + } + + this->width = width; + this->height = height; + + setup(); + } + + void parse() + { + std::set processed_opcodes; + + has_dist = has_ca = has_vign = false; + + auto &exif = metadata.exifData(); + + auto it = exif.findKey(Exiv2::ExifKey("Exif.SubImage1.OpcodeList3")); + + if (it != exif.end()) { + std::vector buf; + buf.resize(it->value().size()); + it->value().copy(buf.data(), Exiv2::invalidByteOrder); + + const Exiv2::byte *data = buf.data(); + uint32_t num_entries = Exiv2::getULong(data, Exiv2::bigEndian); + size_t idx = 4; + + for (size_t i = 0; i < num_entries && idx < buf.size(); ++i) { + uint32_t opcodeID = Exiv2::getULong(data + idx, Exiv2::bigEndian); + idx += 4; + idx += 4; // version + uint32_t flags = Exiv2::getULong(data + idx, Exiv2::bigEndian); + idx += 4; + size_t paramSize = Exiv2::getULong(data + idx, Exiv2::bigEndian); + idx += 4; + + if (idx + paramSize > buf.size()) { + throw std::runtime_error("error parsing DNG OpcodeList3"); + } + + if (processed_opcodes.find(opcodeID) != processed_opcodes.end()) { + // we currently handle only one opcode per type and ignore next ones if provided. + if (settings->verbose) { + std::printf("DNG OpcodeList3 %s opcode %d already processed\n", flags & 1 ? "optional" : "mandatory", opcodeID); + } + + idx += paramSize; + continue; + } + + processed_opcodes.insert(opcodeID); + + // we currently handle only one dist correction + if (opcodeID == 1 && !has_dist) { // WarpRectilinear + + planes = Exiv2::getULong(data + idx, Exiv2::bigEndian); + + if ((planes != 1) && (planes != 3)) { + throw std::runtime_error("cannot parse DNG WarpRectilinear"); + } + + for (int p = 0; p < planes; p++) { + for (int i = 0; i < 6; i++) { + warp_rectilinear[p][i] = Exiv2::getDouble(data + idx + 4 + 8 * (i + p * 6), Exiv2::bigEndian); + } + } + + crx_d = Exiv2::getDouble(data + idx + 4 + 8 * (0 + planes * 6), Exiv2::bigEndian); + cry_d = Exiv2::getDouble(data + idx + 4 + 8 * (1 + planes * 6), Exiv2::bigEndian); + + has_dist = true; + if (planes == 3) { + has_ca = true; + } + + // we currently handle only one vignetting correction + } else if (opcodeID == 3 && !has_vign) { // FixVignetteRadial + size_t start = idx; + size_t end = idx + 7 * 8; + if (end > buf.size()) { + throw std::runtime_error("cannot parse DNG FixVignetteRadial"); + } + for (int j = 0; j < 5; j++) { + vignette_radial[j] = Exiv2::getDouble(data + start, Exiv2::bigEndian); + start += 8; + } + crx_v = Exiv2::getDouble(data + start, Exiv2::bigEndian); + start += 8; + cry_v = Exiv2::getDouble(data + start, Exiv2::bigEndian); + has_vign = true; + + } else { + if (settings->verbose) { + std::printf("DNG OpcodeList3 has unsupported %s opcode %d\n", flags & 1 ? "optional" : "mandatory", opcodeID); + } + } + + idx += paramSize; + } + } + + if (!has_dist && !has_vign) { + throw std::runtime_error("no known DNG correction data"); + } + } + + void setup() + { + cx_d = crx_d * width; + cy_d = cry_d * height; + cx_v = crx_v * width; + cy_v = cry_v * height; + double mx_d = std::max(cx_d, width - cx_d); + double my_d = std::max(cy_d, height - cy_d); + m_d = std::sqrt(SQR(mx_d) + SQR(my_d)); + double mx_v = std::max(cx_v, width - cx_v); + double my_v = std::max(cy_v, height - cy_v); + m_v = std::sqrt(SQR(mx_v) + SQR(my_v)); + } + + void correctPlaneDistortion(double &x, double &y, int cx, int cy, int plane) const + { + if (plane < 0 || plane > 2 || plane > planes) { + return; + } + + double xx = x + cx; + double yy = y + cy; + if (swap_xy) { + std::swap(xx, yy); + } + + const double cx1 = cx_d; + const double cy1 = cy_d; + const double m = m_d; + + const double dx = (xx - cx1) / m; + const double dy = (yy - cy1) / m; + const double dx2 = SQR(dx); + const double dy2 = SQR(dy); + const double r2 = dx2 + dy2; + const double f = warp_rectilinear[plane][0] + r2 * (warp_rectilinear[plane][1] + r2 * (warp_rectilinear[plane][2] + r2 * warp_rectilinear[plane][3])); + const double dx_r = f * dx; + const double dy_r = f * dy; + const double dxdy2 = 2 * dx * dy; + const double dx_t = warp_rectilinear[plane][4] * dxdy2 + warp_rectilinear[plane][5] * (r2 + 2 * dx2); + const double dy_t = warp_rectilinear[plane][5] * dxdy2 + warp_rectilinear[plane][4] * (r2 + 2 * dy2); + + x = cx1 + m * (dx_r + dx_t); + y = cy1 + m * (dy_r + dy_t); + + if (swap_xy) { + std::swap(x, y); + } + x -= cx; + y -= cy; + } + + void correctDistortionAndCA(double &x, double &y, int cx, int cy, int channel) const override + { + if (!hasDistortionCorrection() || !hasCACorrection()) { + return; + } + + correctPlaneDistortion(x, y, cx, cy, channel); + } + + void correctDistortion(double &x, double &y, int cx, int cy) const override + { + if (!hasDistortionCorrection()) { + return; + } + + int plane = 1; // 3 planes correction, use plane 1 (green) + if (planes == 1) { + plane = 0; // 1 single plane correction + } + + correctPlaneDistortion(x, y, cx, cy, plane); + } + + void correctCA(double &x, double &y, int cx, int cy, int channel) const override + { + if (!hasCACorrection()) { + return; + } + + // we use plane 0 (red) and plane 2 (blue) for ca correction + if (channel != 0 && channel != 2) return; + if (planes != 3) return; + + double xgreen = x, ygreen = y; + correctPlaneDistortion(xgreen, ygreen, cx, cy, 1); + + double xch = x, ych = y; + correctPlaneDistortion(xch, ych, cx, cy, channel); + + // Calculate diff from green plane + x += xch - xgreen; + y += ych - ygreen; + } + + void processVignetteNChannels(int width, int height, float **rawData, int channels) const + { + if (!hasVignettingCorrection()) { + return; + } + + const double cx = cx_v; + const double cy = cy_v; + const double m2 = 1.f / SQR(m_v); + + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + const double r2 = m2 * (SQR(x - cx) + SQR(y - cy)); + const double g = 1.f + r2 * (vignette_radial[0] + r2 * (vignette_radial[1] + r2 * (vignette_radial[2] + r2 * (vignette_radial[3] + r2 * vignette_radial[4])))); + for (int c = 0; c < channels; ++c) { + rawData[y][x*channels + c] *= g; + } + } + } + } + + void processVignette(int width, int height, float **rawData) const override + { + return processVignetteNChannels(width, height, rawData, 1); + } + + void processVignette3Channels(int width, int height, float **rawData) const override + { + return processVignetteNChannels(width, height, rawData, 3); + } + + bool isCACorrectionAvailable() const + { + return hasCACorrection(); + } + + bool hasDistortionCorrection() const override { return has_dist; } + bool hasVignettingCorrection() const override { return has_vign; } + bool hasCACorrection() const override { return has_ca; } +}; + std::unique_ptr MetadataLensCorrectionFinder::findCorrection(const FramesMetaData *meta) { static const std::unordered_set makers = { @@ -711,14 +1011,16 @@ std::unique_ptr MetadataLensCorrectionFinder::findCorrec std::string make = Glib::ustring(meta->getMake()).uppercase(); - if (makers.find(make) == makers.end()) { + if (!meta->getDNG() && makers.find(make) == makers.end()) { return nullptr; } std::unique_ptr correction; try { - if (make == "SONY") { + if (meta->getDNG()) { + correction.reset(new DNGMetadataLensCorrection(meta)); + } else if (make == "SONY") { correction.reset(new SonyMetadataLensCorrection(meta)); } else if (make == "FUJIFILM") { correction.reset(new FujiMetadataLensCorrection(meta));