diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt
index 1750e0572..ad94dcab8 100644
--- a/rtengine/CMakeLists.txt
+++ b/rtengine/CMakeLists.txt
@@ -106,6 +106,7 @@ set(RTENGINESOURCEFILES
lj92.c
loadinitial.cc
myfile.cc
+ panasonic_decoders.cc
pdaflinesfilter.cc
PF_correct_RT.cc
pipettebuffer.cc
diff --git a/rtengine/camconst.json b/rtengine/camconst.json
index 3393dec9f..32e8bc628 100644
--- a/rtengine/camconst.json
+++ b/rtengine/camconst.json
@@ -2142,6 +2142,11 @@ Camera constants:
}
},
+ { // Quality B, per ISO info missing
+ "make_model": [ "Panasonic DC-S1", "Panasonic DC-S1R" ],
+ "ranges": { "white": 16225 }
+ },
+
{ // Quality B, per ISO info missing
"make_model": "PENTAX K-x",
"dcraw_matrix": [ 8843,-2837,-625,-5025,12644,2668,-411,1234,7410 ], // adobe dcp d65
diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc
index ae6f60cd1..b81594dc4 100644
--- a/rtengine/dcraw.cc
+++ b/rtengine/dcraw.cc
@@ -2688,93 +2688,6 @@ void CLASS canon_rmf_load_raw()
maximum = curve[0x3ff];
}
-unsigned CLASS pana_bits_t::operator() (int nbits, unsigned *bytes)
-{
-/*RT static uchar buf[0x4000]; */
-/*RT static int vbits;*/
- int byte;
-
- if (!nbits && !bytes) return vbits=0;
- if (!vbits) {
- fread (buf+load_flags, 1, 0x4000-load_flags, ifp);
- fread (buf, 1, load_flags, ifp);
- }
- if (encoding == 5) {
- for (byte = 0; byte < 16; byte++)
- {
- bytes[byte] = buf[vbits++];
- vbits &= 0x3FFF;
- }
- return 0;
- } else {
- vbits = (vbits - nbits) & 0x1ffff;
- byte = vbits >> 3 ^ 0x3ff0;
- return (buf[byte] | buf[byte+1] << 8) >> (vbits & 7) & ~(-1 << nbits);
- }
-}
-
-void CLASS panasonic_load_raw()
-{
- pana_bits_t pana_bits(ifp,load_flags, RT_pana_info.encoding);
- int row, col, i, j, sh=0, pred[2], nonz[2];
- unsigned bytes[16] = {};
- ushort *raw_block_data;
-
- pana_bits(0, 0);
- int enc_blck_size = RT_pana_info.bpp == 12 ? 10 : 9;
- if (RT_pana_info.encoding == 5) {
- for (row = 0; row < raw_height; row++)
- {
- raw_block_data = raw_image + row * raw_width;
-
- for (col = 0; col < raw_width; col += enc_blck_size) {
- pana_bits(0, bytes);
-
- if (RT_pana_info.bpp == 12) {
- raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0];
- raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4);
- raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3];
- raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4);
- raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6];
- raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4);
- raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9];
- raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4);
- raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12];
- raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4);
- }
- else if (RT_pana_info.bpp == 14) {
- raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8);
- raw_block_data[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) +
- ((bytes[3] & 0xF) << 10);
- raw_block_data[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) +
- ((bytes[5] & 3) << 12);
- raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6);
- raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8);
- raw_block_data[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10);
- raw_block_data[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12);
- raw_block_data[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6);
- raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8);
- }
- }
- }
- } else {
- for (row=0; row < height; row++)
- for (col=0; col < raw_width; col++) {
- if ((i = col % 14) == 0)
- pred[0] = pred[1] = nonz[0] = nonz[1] = 0;
- if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2));
- if (nonz[i & 1]) {
- if ((j = pana_bits(8))) {
- if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4)
- pred[i & 1] &= ~(-1 << sh);
- pred[i & 1] += j << sh;
- }
- } else if ((nonz[i & 1] = pana_bits(8)) || i > 11)
- pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4);
- if ((RAW(row,col) = pred[col & 1]) > 4098 && col < width) derror();
- }
- }
-}
void CLASS olympus_load_raw()
{
@@ -10759,8 +10672,6 @@ void CLASS nikon_14bit_load_raw()
free(buf);
}
-//-----------------------------------------------------------------------------
-
/* RT: Delete from here */
/*RT*/#undef SQR
/*RT*/#undef MAX
diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h
index 5e17b47ab..3d753d876 100644
--- a/rtengine/dcraw.h
+++ b/rtengine/dcraw.h
@@ -411,6 +411,9 @@ private:
unsigned encoding;
};
+void panasonicC6_load_raw();
+void panasonicC7_load_raw();
+
void canon_rmf_load_raw();
void panasonic_load_raw();
void olympus_load_raw();
diff --git a/rtengine/panasonic_decoders.cc b/rtengine/panasonic_decoders.cc
new file mode 100644
index 000000000..37f586a6b
--- /dev/null
+++ b/rtengine/panasonic_decoders.cc
@@ -0,0 +1,278 @@
+/*
+ * This file is part of RawTherapee.
+ *
+ * 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 "dcraw.h"
+
+// Code adapted from libraw
+/* -*- C++ -*-
+ * Copyright 2019 LibRaw LLC (info@libraw.org)
+ *
+ LibRaw is free software; you can redistribute it and/or modify
+ it under the terms of the one of two licenses as you choose:
+
+1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1
+ (See file LICENSE.LGPL provided in LibRaw distribution archive for details).
+
+2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+ (See file LICENSE.CDDL provided in LibRaw distribution archive for details).
+
+*/
+
+unsigned DCraw::pana_bits_t::operator() (int nbits, unsigned *bytes)
+{
+ int byte;
+
+ if (!nbits && !bytes) {
+ return vbits=0;
+ }
+ if (!vbits) {
+ fread (buf+load_flags, 1, 0x4000-load_flags, ifp);
+ fread (buf, 1, load_flags, ifp);
+ }
+ if (encoding == 5) {
+ for (byte = 0; byte < 16; byte++)
+ {
+ bytes[byte] = buf[vbits++];
+ vbits &= 0x3FFF;
+ }
+ return 0;
+ } else {
+ vbits = (vbits - nbits) & 0x1ffff;
+ byte = vbits >> 3 ^ 0x3ff0;
+ return (buf[byte] | buf[byte+1] << 8) >> (vbits & 7) & ~(-1 << nbits);
+ }
+}
+
+class pana_cs6_page_decoder
+{
+ unsigned int pixelbuffer[14], lastoffset, maxoffset;
+ unsigned char current, *buffer;
+public:
+ pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize)
+ : lastoffset(0), maxoffset(bsize), current(0), buffer(_buffer)
+ {
+ }
+ void read_page(); // will throw IO error if not enough space in buffer
+ unsigned int nextpixel()
+ {
+ return current < 14 ? pixelbuffer[current++] : 0;
+ }
+};
+
+#define wbuffer(i) ((unsigned short)buffer[lastoffset + 15 - i])
+
+void pana_cs6_page_decoder::read_page()
+{
+ if (!buffer || (maxoffset - lastoffset < 16))
+ ;
+ pixelbuffer[0] = (wbuffer(0) << 6) | (wbuffer(1) >> 2); // 14 bit
+ pixelbuffer[1] = (((wbuffer(1) & 0x3) << 12) | (wbuffer(2) << 4) | (wbuffer(3) >> 4)) & 0x3fff;
+ pixelbuffer[2] = (wbuffer(3) >> 2) & 0x3;
+ pixelbuffer[3] = ((wbuffer(3) & 0x3) << 8) | wbuffer(4);
+ pixelbuffer[4] = (wbuffer(5) << 2) | (wbuffer(6) >> 6);
+ pixelbuffer[5] = ((wbuffer(6) & 0x3f) << 4) | (wbuffer(7) >> 4);
+ pixelbuffer[6] = (wbuffer(7) >> 2) & 0x3;
+ pixelbuffer[7] = ((wbuffer(7) & 0x3) << 8) | wbuffer(8);
+ pixelbuffer[8] = ((wbuffer(9) << 2) & 0x3fc) | (wbuffer(10) >> 6);
+ pixelbuffer[9] = ((wbuffer(10) << 4) | (wbuffer(11) >> 4)) & 0x3ff;
+ pixelbuffer[10] = (wbuffer(11) >> 2) & 0x3;
+ pixelbuffer[11] = ((wbuffer(11) & 0x3) << 8) | wbuffer(12);
+ pixelbuffer[12] = (((wbuffer(13) << 2) & 0x3fc) | wbuffer(14) >> 6) & 0x3ff;
+ pixelbuffer[13] = ((wbuffer(14) << 4) | (wbuffer(15) >> 4)) & 0x3ff;
+ current = 0;
+ lastoffset += 16;
+}
+#undef wbuffer
+
+void DCraw::panasonic_load_raw()
+{
+ int enc_blck_size = RT_pana_info.bpp == 12 ? 10 : 9;
+ if (RT_pana_info.encoding == 5) {
+ pana_bits_t pana_bits(ifp, load_flags, RT_pana_info.encoding);
+ pana_bits(0, 0);
+ unsigned bytes[16] = {};
+ for (int row = 0; row < raw_height; ++row) {
+ ushort* raw_block_data = raw_image + row * raw_width;
+
+ for (int col = 0; col < raw_width; col += enc_blck_size) {
+ pana_bits(0, bytes);
+
+ if (RT_pana_info.bpp == 12) {
+ raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0];
+ raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4);
+ raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3];
+ raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4);
+ raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6];
+ raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4);
+ raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9];
+ raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4);
+ raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12];
+ raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4);
+ }
+ else if (RT_pana_info.bpp == 14) {
+ raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8);
+ raw_block_data[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10);
+ raw_block_data[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12);
+ raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6);
+ raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8);
+ raw_block_data[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10);
+ raw_block_data[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12);
+ raw_block_data[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6);
+ raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8);
+ }
+ }
+ }
+ } else if (RT_pana_info.encoding == 6) {
+ panasonicC6_load_raw();
+ } else if (RT_pana_info.encoding == 7) {
+ panasonicC7_load_raw();
+ } else {
+ pana_bits_t pana_bits(ifp, load_flags, RT_pana_info.encoding);
+ pana_bits(0, 0);
+ int sh = 0, pred[2], nonz[2];
+ for (int row = 0; row < height; ++row) {
+ for (int col = 0; col < raw_width; ++col) {
+ int i;
+ if ((i = col % 14) == 0) {
+ pred[0] = pred[1] = nonz[0] = nonz[1] = 0;
+ }
+ if (i % 3 == 2) {
+ sh = 4 >> (3 - pana_bits(2));
+ }
+ if (nonz[i & 1]) {
+ int j;
+ if ((j = pana_bits(8))) {
+ if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) {
+ pred[i & 1] &= ~(-1 << sh);
+ }
+ pred[i & 1] += j << sh;
+ }
+ } else if ((nonz[i & 1] = pana_bits(8)) || i > 11) {
+ pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4);
+ }
+ if ((raw_image[(row)*raw_width+(col)] = pred[col & 1]) > 4098 && col < width) {
+ derror();
+ }
+ }
+ }
+ }
+}
+
+void DCraw::panasonicC6_load_raw()
+{
+ constexpr int rowstep = 16;
+ const int blocksperrow = raw_width / 11;
+ const int rowbytes = blocksperrow * 16;
+ unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep);
+ merror(iobuf, "panasonicC6_load_raw()");
+
+ for (int row = 0; row < raw_height - rowstep + 1; row += rowstep) {
+ const int rowstoread = MIN(rowstep, raw_height - row);
+ fread(iobuf, rowbytes, rowstoread, ifp);
+ pana_cs6_page_decoder page(iobuf, rowbytes * rowstoread);
+ 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();
+ unsigned oddeven[2] = {0, 0}, nonzero[2] = {0, 0};
+ unsigned pmul = 0, pixel_base = 0;
+ for (int pix = 0; pix < 11; ++pix) {
+ if (pix % 3 == 2) {
+ unsigned base = page.nextpixel();
+ if (base > 3) {
+ derror();
+ }
+ if (base == 3) {
+ base = 4;
+ }
+ pixel_base = 0x200 << base;
+ pmul = 1 << base;
+ }
+ unsigned epixel = page.nextpixel();
+ if (oddeven[pix % 2]) {
+ epixel *= pmul;
+ if (pixel_base < 0x2000 && nonzero[pix % 2] > pixel_base) {
+ epixel += nonzero[pix % 2] - pixel_base;
+ }
+ nonzero[pix % 2] = epixel;
+ } else {
+ oddeven[pix % 2] = epixel;
+ if (epixel) {
+ nonzero[pix % 2] = epixel;
+ } else {
+ epixel = nonzero[pix % 2];
+ }
+ }
+ const unsigned spix = epixel - 0xf;
+ if (spix <= 0xffff) {
+ rowptr[col++] = spix & 0xffff;
+ } else {
+ epixel = (((signed int)(epixel + 0x7ffffff1)) >> 0x1f);
+ rowptr[col++] = epixel & 0x3fff;
+ }
+ }
+ }
+ }
+ }
+ free(iobuf);
+ tiff_bps = RT_pana_info.bpp;
+}
+
+void DCraw::panasonicC7_load_raw()
+{
+ constexpr int rowstep = 16;
+ const int pixperblock = RT_pana_info.bpp == 14 ? 9 : 10;
+ const int rowbytes = raw_width / pixperblock * 16;
+
+ unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep);
+ merror(iobuf, "panasonicC7_load_raw()");
+ for (int row = 0; row < raw_height - rowstep + 1; row += rowstep) {
+ const int rowstoread = MIN(rowstep, raw_height - row);
+ fread (iobuf, rowbytes, rowstoread, ifp);
+ unsigned char *bytes = iobuf;
+ for (int crow = 0; crow < rowstoread; crow++) {
+ ushort *rowptr = &raw_image[(row + crow) * raw_width];
+ for (int col = 0; col < raw_width - pixperblock + 1; col += pixperblock, bytes += 16) {
+ if (RT_pana_info.bpp == 14) {
+ rowptr[col] = bytes[0] + ((bytes[1] & 0x3F) << 8);
+ rowptr[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10);
+ rowptr[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12);
+ rowptr[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6);
+ rowptr[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8);
+ rowptr[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10);
+ rowptr[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12);
+ rowptr[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6);
+ rowptr[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8);
+ } else if (RT_pana_info.bpp == 12) { // have not seen in the wild yet
+ rowptr[col] = ((bytes[1] & 0xF) << 8) + bytes[0];
+ rowptr[col + 1] = 16 * bytes[2] + (bytes[1] >> 4);
+ rowptr[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3];
+ rowptr[col + 3] = 16 * bytes[5] + (bytes[4] >> 4);
+ rowptr[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6];
+ rowptr[col + 5] = 16 * bytes[8] + (bytes[7] >> 4);
+ rowptr[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9];
+ rowptr[col + 7] = 16 * bytes[11] + (bytes[10] >> 4);
+ rowptr[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12];
+ rowptr[col + 9] = 16 * bytes[14] + (bytes[13] >> 4);
+ }
+ }
+ }
+ }
+ free(iobuf);
+ tiff_bps = RT_pana_info.bpp;
+}
diff --git a/rtengine/pipettebuffer.h b/rtengine/pipettebuffer.h
index ef8a5f69a..79b6dd8c5 100644
--- a/rtengine/pipettebuffer.h
+++ b/rtengine/pipettebuffer.h
@@ -19,7 +19,6 @@
#pragma once
#include "array2D.h"
-#include "coord.h"
#include "iimage.h"
class EditDataProvider;
diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc
index b2edc2842..89ff6cd33 100644
--- a/rtexif/rtexif.cc
+++ b/rtexif/rtexif.cc
@@ -54,13 +54,13 @@ Interpreter stdInterpreter;
//-----------------------------------------------------------------------------
TagDirectory::TagDirectory ()
- : attribs (ifdAttribs), order (HOSTORDER), parent (nullptr) {}
+ : attribs (ifdAttribs), order (HOSTORDER), parent (nullptr), parseJPEG(true) {}
TagDirectory::TagDirectory (TagDirectory* p, const TagAttrib* ta, ByteOrder border)
- : attribs (ta), order (border), parent (p) {}
+ : attribs (ta), order (border), parent (p), parseJPEG(true) {}
-TagDirectory::TagDirectory (TagDirectory* p, FILE* f, int base, const TagAttrib* ta, ByteOrder border, bool skipIgnored)
- : attribs (ta), order (border), parent (p)
+TagDirectory::TagDirectory (TagDirectory* p, FILE* f, int base, const TagAttrib* ta, ByteOrder border, bool skipIgnored, bool parseJpeg)
+ : attribs (ta), order (border), parent (p), parseJPEG(parseJpeg)
{
int numOfTags = get2 (f, order);
@@ -980,9 +980,10 @@ Tag::Tag (TagDirectory* p, FILE* f, int base)
}
}
- if (tag == 0x002e) { // location of the embedded preview image in raw files of Panasonic cameras
+ if (parent->getParseJpeg() && tag == 0x002e) { // location of the embedded preview image in raw files of Panasonic cameras
ExifManager eManager(f, nullptr, true);
const auto fpos = ftell(f);
+
if (fpos >= 0) {
eManager.parseJPEG(fpos); // try to parse the exif data from the preview image
@@ -1239,7 +1240,7 @@ defsubdirs:
for (size_t j = 0, i = 0; j < count; j++, i++) {
int newpos = base + toInt (j * 4, LONG);
fseek (f, newpos, SEEK_SET);
- directory[i] = new TagDirectory (parent, f, base, attrib->subdirAttribs, order);
+ directory[i] = new TagDirectory (parent, f, base, attrib->subdirAttribs, order, true, parent->getParseJpeg());
}
// set the terminating NULL
@@ -1374,7 +1375,7 @@ bool Tag::parseMakerNote (FILE* f, int base, ByteOrder bom )
value = new unsigned char[12];
fread (value, 1, 12, f);
directory = new TagDirectory*[2];
- directory[0] = new TagDirectory (parent, f, base, panasonicAttribs, bom);
+ directory[0] = new TagDirectory (parent, f, base, panasonicAttribs, bom, true, parent->getParseJpeg());
directory[1] = nullptr;
} else {
return false;
@@ -2777,7 +2778,7 @@ void ExifManager::parseStd (bool skipIgnored) {
parse(false, skipIgnored);
}
-void ExifManager::parse (bool isRaw, bool skipIgnored)
+void ExifManager::parse (bool isRaw, bool skipIgnored, bool parseJpeg)
{
int ifdOffset = IFDOffset;
@@ -2806,7 +2807,7 @@ void ExifManager::parse (bool isRaw, bool skipIgnored)
fseek (f, rml->exifBase + ifdOffset, SEEK_SET);
// first read the IFD directory
- TagDirectory* root = new TagDirectory (nullptr, f, rml->exifBase, ifdAttribs, order, skipIgnored);
+ TagDirectory* root = new TagDirectory (nullptr, f, rml->exifBase, ifdAttribs, order, skipIgnored, parseJpeg);
// fix ISO issue with nikon and panasonic cameras
Tag* make = root->getTag ("Make");
@@ -3174,7 +3175,7 @@ void ExifManager::parseJPEG (int offset)
rml.reset(new rtengine::RawMetaDataLocation(0));
}
rml->exifBase = tiffbase;
- parse (false);
+ parse (false, true, false);
if (rmlCreated) {
rml.reset();
}
diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h
index 4c5a6cafe..c37533352 100644
--- a/rtexif/rtexif.h
+++ b/rtexif/rtexif.h
@@ -119,11 +119,12 @@ protected:
const TagAttrib* attribs; // descriptor table to decode the tags
ByteOrder order; // byte order
TagDirectory* parent; // parent directory (NULL if root)
+ bool parseJPEG;
static Glib::ustring getDumpKey (int tagID, const Glib::ustring &tagName);
public:
TagDirectory ();
- TagDirectory (TagDirectory* p, FILE* f, int base, const TagAttrib* ta, ByteOrder border, bool skipIgnored = true);
+ TagDirectory (TagDirectory* p, FILE* f, int base, const TagAttrib* ta, ByteOrder border, bool skipIgnored = true, bool parseJpeg = true);
TagDirectory (TagDirectory* p, const TagAttrib* ta, ByteOrder border);
virtual ~TagDirectory ();
@@ -135,6 +136,10 @@ public:
{
return parent;
}
+ inline bool getParseJpeg() const
+ {
+ return parseJPEG;
+ }
TagDirectory* getRoot ();
inline int getCount () const
{
@@ -346,7 +351,7 @@ class ExifManager
Tag* saveCIFFMNTag (TagDirectory* root, int len, const char* name);
void parseCIFF (int length, TagDirectory* root);
- void parse (bool isRaw, bool skipIgnored = true);
+ void parse (bool isRaw, bool skipIgnored = true, bool parseJpeg = true);
public:
FILE* f;
diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc
index acb45c266..afbec9efb 100644
--- a/rtgui/batchqueue.cc
+++ b/rtgui/batchqueue.cc
@@ -31,6 +31,7 @@
#include "cachemanager.h"
#include "thumbnail.h"
#include "batchqueue.h"
+#include "batchqueueentry.h"
#include "multilangmgr.h"
#include "filecatalog.h"
#include "batchqueuebuttonset.h"
diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h
index 9ae615965..f0289faa4 100644
--- a/rtgui/batchqueue.h
+++ b/rtgui/batchqueue.h
@@ -21,7 +21,6 @@
#include
-#include "batchqueueentry.h"
#include "lwbutton.h"
#include "lwbuttonset.h"
#include "threadutils.h"
@@ -30,6 +29,8 @@
#include "../rtengine/rtengine.h"
#include "../rtengine/noncopyable.h"
+class BatchQueueEntry;
+
class BatchQueueListener
{
diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h
index 590ec2347..7c0a367d4 100644
--- a/rtgui/batchqueuepanel.h
+++ b/rtgui/batchqueuepanel.h
@@ -29,6 +29,7 @@
class RTWindow;
class FileCatalog;
class Thumbnail;
+
class BatchQueuePanel : public Gtk::VBox,
public BatchQueueListener,
public FormatChangeListener
diff --git a/rtgui/bayerpreprocess.h b/rtgui/bayerpreprocess.h
index c07bbcba4..16b469626 100644
--- a/rtgui/bayerpreprocess.h
+++ b/rtgui/bayerpreprocess.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class BayerPreProcess : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
+class BayerPreProcess final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
{
protected:
diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h
index 04985dc66..5c7498986 100644
--- a/rtgui/bayerprocess.h
+++ b/rtgui/bayerprocess.h
@@ -25,7 +25,7 @@
#include "guiutils.h"
#include "toolpanel.h"
-class BayerProcess :
+class BayerProcess final :
public ToolParamBlock,
public AdjusterListener,
public CheckBoxListener,
diff --git a/rtgui/bayerrawexposure.h b/rtgui/bayerrawexposure.h
index 247bf6ff0..eb18aa0e3 100644
--- a/rtgui/bayerrawexposure.h
+++ b/rtgui/bayerrawexposure.h
@@ -24,7 +24,7 @@
#include "checkbox.h"
#include "toolpanel.h"
-class BayerRAWExposure :
+class BayerRAWExposure final :
public ToolParamBlock,
public AdjusterListener,
public CheckBoxListener,
diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc
index b3ebea28a..596d99607 100644
--- a/rtgui/blackwhite.cc
+++ b/rtgui/blackwhite.cc
@@ -21,6 +21,8 @@
#include "blackwhite.h"
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "guiutils.h"
#include "rtimage.h"
#include "options.h"
diff --git a/rtgui/blackwhite.h b/rtgui/blackwhite.h
index 9f504fd4f..1aed86997 100644
--- a/rtgui/blackwhite.h
+++ b/rtgui/blackwhite.h
@@ -22,13 +22,14 @@
#include "adjuster.h"
#include "colorprovider.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "guiutils.h"
-#include "mycurve.h"
#include "toolpanel.h"
+class DiagonalCurveEditor;
+class CurveEditorGroup;
class EditDataProvider;
+class FlatCurveEditor;
class BlackWhite final :
public ToolParamBlock,
diff --git a/rtgui/cacorrection.h b/rtgui/cacorrection.h
index 6e1667a00..12d6396eb 100644
--- a/rtgui/cacorrection.h
+++ b/rtgui/cacorrection.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class CACorrection :
+class CACorrection final:
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/chmixer.h b/rtgui/chmixer.h
index fb028cf14..d80b89cf7 100644
--- a/rtgui/chmixer.h
+++ b/rtgui/chmixer.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class ChMixer :
+class ChMixer final:
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/coarsepanel.h b/rtgui/coarsepanel.h
index c028bbcad..b7b4f8cf7 100644
--- a/rtgui/coarsepanel.h
+++ b/rtgui/coarsepanel.h
@@ -22,7 +22,7 @@
#include "toolpanel.h"
-class CoarsePanel :
+class CoarsePanel final :
public Gtk::HBox,
public ToolPanel
{
diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc
index 094ffec2f..9a6bee524 100644
--- a/rtgui/colorappearance.cc
+++ b/rtgui/colorappearance.cc
@@ -20,6 +20,8 @@
#include "colorappearance.h"
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "guiutils.h"
#include "options.h"
#include "rtimage.h"
diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h
index 3d82ee831..170212ffe 100644
--- a/rtgui/colorappearance.h
+++ b/rtgui/colorappearance.h
@@ -22,11 +22,14 @@
#include "adjuster.h"
#include "colorprovider.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "guiutils.h"
#include "toolpanel.h"
+class DiagonalCurveEditor;
+class CurveEditorGroup;
+class CurveEditor;
+
class ColorAppearance final :
public ToolParamBlock,
public AdjusterListener,
diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc
index 1a6a9b918..59768a6ce 100644
--- a/rtgui/colortoning.cc
+++ b/rtgui/colortoning.cc
@@ -2,6 +2,8 @@
* This file is part of RawTherapee.
*/
#include "colortoning.h"
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "mycurve.h"
#include "rtimage.h"
#include "eventmapper.h"
diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h
index 9c7a54488..f1024f41c 100644
--- a/rtgui/colortoning.h
+++ b/rtgui/colortoning.h
@@ -7,15 +7,19 @@
#include "adjuster.h"
#include "colorprovider.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "guiutils.h"
-#include "labgrid.h"
#include "thresholdadjuster.h"
#include "toolpanel.h"
#include "../rtengine/procparams.h"
+class CurveEditor;
+class CurveEditorGroup;
+class DiagonalCurveEditor;
+class FlatCurveEditor;
+class LabGrid;
+
class ColorToning final :
public ToolParamBlock,
public FoldableToolPanel,
diff --git a/rtgui/curveeditor.cc b/rtgui/curveeditor.cc
index c0bd2c497..e38f3a947 100644
--- a/rtgui/curveeditor.cc
+++ b/rtgui/curveeditor.cc
@@ -21,6 +21,7 @@
#include
#include "guiutils.h"
#include "multilangmgr.h"
+#include "popuptogglebutton.h"
#include "../rtengine/LUT.h"
#include
diff --git a/rtgui/curveeditor.h b/rtgui/curveeditor.h
index 0543f88bc..21070fad6 100644
--- a/rtgui/curveeditor.h
+++ b/rtgui/curveeditor.h
@@ -20,7 +20,6 @@
#include "coloredbar.h"
#include "editcallbacks.h"
-#include "popuptogglebutton.h"
#include "../rtengine/diagonalcurvetypes.h"
#include "../rtengine/flatcurvetypes.h"
@@ -29,6 +28,7 @@
class CurveEditorGroup;
class CurveEditorSubGroup;
+class PopUpToggleButton;
/*
*********************** Curve Editor ***********************
@@ -143,7 +143,7 @@ public:
*/
-class DiagonalCurveEditor : public CurveEditor
+class DiagonalCurveEditor final : public CurveEditor
{
friend class DiagonalCurveEditorSubGroup;
@@ -179,7 +179,7 @@ public:
*/
-class FlatCurveEditor : public CurveEditor
+class FlatCurveEditor final : public CurveEditor
{
friend class FlatCurveEditorSubGroup;
diff --git a/rtgui/curveeditorgroup.cc b/rtgui/curveeditorgroup.cc
index 93e440aac..5c120f7e4 100644
--- a/rtgui/curveeditorgroup.cc
+++ b/rtgui/curveeditorgroup.cc
@@ -24,6 +24,7 @@
#include "diagonalcurveeditorsubgroup.h"
#include "flatcurveeditorsubgroup.h"
#include "multilangmgr.h"
+#include "popuptogglebutton.h"
#include "rtimage.h"
#include "options.h"
#include "pathutils.h"
diff --git a/rtgui/curveeditorgroup.h b/rtgui/curveeditorgroup.h
index 1ff3485db..4049d8d6c 100644
--- a/rtgui/curveeditorgroup.h
+++ b/rtgui/curveeditorgroup.h
@@ -41,7 +41,7 @@ class FlatCurveEditorSubGroup;
* - to start a new line of curve button, use the 'newLine' method
* - if you add more than one curve, you must add a "CurveEditor* ce" parameter to your listener
*/
-class CurveEditorGroup : public Gtk::Grid, public CurveListener
+class CurveEditorGroup final : public Gtk::Grid, public CurveListener
{
friend class CurveEditor;
diff --git a/rtgui/darkframe.h b/rtgui/darkframe.h
index 779caf16f..30696e3db 100644
--- a/rtgui/darkframe.h
+++ b/rtgui/darkframe.h
@@ -41,7 +41,7 @@ public:
// add other info here
};
-class DarkFrame :
+class DarkFrame final:
public ToolParamBlock,
public FoldableToolPanel
{
diff --git a/rtgui/defringe.cc b/rtgui/defringe.cc
index 7114f9a52..cdec88edc 100644
--- a/rtgui/defringe.cc
+++ b/rtgui/defringe.cc
@@ -20,6 +20,8 @@
#include
#include "defringe.h"
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "options.h"
#include "../rtengine/color.h"
diff --git a/rtgui/defringe.h b/rtgui/defringe.h
index 5dd17b547..ebf1eecd8 100644
--- a/rtgui/defringe.h
+++ b/rtgui/defringe.h
@@ -22,12 +22,14 @@
#include "adjuster.h"
#include "colorprovider.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "guiutils.h"
#include "toolpanel.h"
-class Defringe :
+class CurveEditorGroup;
+class FlatCurveEditor;
+
+class Defringe final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel,
diff --git a/rtgui/dehaze.h b/rtgui/dehaze.h
index 6a9d31cd1..79d2e015c 100644
--- a/rtgui/dehaze.h
+++ b/rtgui/dehaze.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class Dehaze: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
+class Dehaze final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
{
private:
Adjuster *strength;
diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc
index cece9be66..eed6c63d3 100644
--- a/rtgui/diagonalcurveeditorsubgroup.cc
+++ b/rtgui/diagonalcurveeditorsubgroup.cc
@@ -32,6 +32,7 @@
#include "diagonalcurveeditorsubgroup.h"
#include "rtimage.h"
#include "options.h"
+#include "popuptogglebutton.h"
#include "../rtengine/curves.h"
diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc
index b429dfc9f..7129542d1 100644
--- a/rtgui/dirpyrdenoise.cc
+++ b/rtgui/dirpyrdenoise.cc
@@ -21,6 +21,8 @@
#include "dirpyrdenoise.h"
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "editbuffer.h"
#include "guiutils.h"
#include "options.h"
diff --git a/rtgui/dirpyrdenoise.h b/rtgui/dirpyrdenoise.h
index 424104314..c754e705c 100644
--- a/rtgui/dirpyrdenoise.h
+++ b/rtgui/dirpyrdenoise.h
@@ -22,11 +22,13 @@
#include "adjuster.h"
#include "colorprovider.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "guiutils.h"
#include "toolpanel.h"
+class CurveEditor;
+class CurveEditorGroup;
+class FlatCurveEditor;
class EditDataProvider;
class DirPyrDenoise final :
diff --git a/rtgui/dirpyrequalizer.h b/rtgui/dirpyrequalizer.h
index ff08f36bc..84924099e 100644
--- a/rtgui/dirpyrequalizer.h
+++ b/rtgui/dirpyrequalizer.h
@@ -25,7 +25,7 @@
#include "thresholdadjuster.h"
#include "toolpanel.h"
-class DirPyrEqualizer :
+class DirPyrEqualizer final :
public ToolParamBlock,
public ThresholdAdjusterListener,
public AdjusterListener,
diff --git a/rtgui/distortion.h b/rtgui/distortion.h
index dab20bbd9..7ef33d73a 100644
--- a/rtgui/distortion.h
+++ b/rtgui/distortion.h
@@ -24,7 +24,7 @@
#include "lensgeomlistener.h"
#include "toolpanel.h"
-class Distortion :
+class Distortion final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/editbuffer.h b/rtgui/editbuffer.h
index 046ab7364..a5cf8d0e4 100644
--- a/rtgui/editbuffer.h
+++ b/rtgui/editbuffer.h
@@ -19,9 +19,14 @@
#pragma once
#include "editid.h"
-#include "../rtengine/coord.h"
#include
+namespace rtengine {
+
+struct Coord;
+
+}
+
class EditDataProvider;
class EditSubscriber;
diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc
index df3ecf894..5824bcba3 100644
--- a/rtgui/editorpanel.cc
+++ b/rtgui/editorpanel.cc
@@ -24,6 +24,7 @@
#include "../rtengine/imagesource.h"
#include "../rtengine/iccstore.h"
#include "batchqueue.h"
+#include "batchqueueentry.h"
#include "soundman.h"
#include "rtimage.h"
#include "rtwindow.h"
diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h
index b577b858f..e348222a5 100644
--- a/rtgui/editorpanel.h
+++ b/rtgui/editorpanel.h
@@ -21,7 +21,6 @@
#include
-#include "batchqueueentry.h"
#include "filepanel.h"
#include "histogrampanel.h"
#include "history.h"
@@ -35,7 +34,9 @@
#include "../rtengine/noncopyable.h"
#include "../rtengine/rtengine.h"
+class BatchQueueEntry;
class EditorPanel;
+class FilePanel;
class MyProgressBar;
class Thumbnail;
class ToolPanelCoordinator;
diff --git a/rtgui/epd.h b/rtgui/epd.h
index 410004d89..6a5160623 100644
--- a/rtgui/epd.h
+++ b/rtgui/epd.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class EdgePreservingDecompositionUI :
+class EdgePreservingDecompositionUI final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/fattaltonemap.h b/rtgui/fattaltonemap.h
index 9f788351c..3d36ec7d2 100644
--- a/rtgui/fattaltonemap.h
+++ b/rtgui/fattaltonemap.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class FattalToneMapping: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
+class FattalToneMapping final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
{
protected:
Adjuster *threshold;
diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc
index 4d31d625e..9da4044c1 100644
--- a/rtgui/filebrowserentry.cc
+++ b/rtgui/filebrowserentry.cc
@@ -21,6 +21,7 @@
#include
#include
+#include "cropguilistener.h"
#include "cursormanager.h"
#include "guiutils.h"
#include "inspector.h"
@@ -28,6 +29,7 @@
#include "threadutils.h"
#include "thumbbrowserbase.h"
#include "thumbnail.h"
+#include "toolbar.h"
#include "../rtengine/procparams.h"
diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc
index 4fea8563d..c3866a5f3 100644
--- a/rtgui/filecatalog.cc
+++ b/rtgui/filecatalog.cc
@@ -36,6 +36,7 @@
#include "renamedlg.h"
#include "thumbimageupdater.h"
#include "batchqueue.h"
+#include "batchqueueentry.h"
#include "placesbrowser.h"
#include "pathutils.h"
#include "thumbnail.h"
diff --git a/rtgui/filethumbnailbuttonset.h b/rtgui/filethumbnailbuttonset.h
index 66d5b5f67..868d3b58a 100644
--- a/rtgui/filethumbnailbuttonset.h
+++ b/rtgui/filethumbnailbuttonset.h
@@ -22,7 +22,6 @@
#include
-#include "filebrowserentry.h"
#include "lwbuttonset.h"
class FileBrowserEntry;
diff --git a/rtgui/filmnegative.h b/rtgui/filmnegative.h
index 85919bef9..bca155ceb 100644
--- a/rtgui/filmnegative.h
+++ b/rtgui/filmnegative.h
@@ -26,7 +26,6 @@
#include "editcallbacks.h"
#include "guiutils.h"
#include "toolpanel.h"
-#include "wbprovider.h"
class FilmNegProvider
{
@@ -36,7 +35,7 @@ public:
virtual bool getFilmNegativeExponents(rtengine::Coord spotA, rtengine::Coord spotB, std::array& newExps) = 0;
};
-class FilmNegative :
+class FilmNegative final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel,
diff --git a/rtgui/filmsimulation.h b/rtgui/filmsimulation.h
index fc9e804e1..cfe7016bb 100644
--- a/rtgui/filmsimulation.h
+++ b/rtgui/filmsimulation.h
@@ -10,7 +10,7 @@
#include "guiutils.h"
#include "toolpanel.h"
-class ClutComboBox :
+class ClutComboBox final :
public MyComboBox
{
public:
diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc
index 31809cc14..1cc3f5c14 100644
--- a/rtgui/flatcurveeditorsubgroup.cc
+++ b/rtgui/flatcurveeditorsubgroup.cc
@@ -33,6 +33,7 @@
#include "flatcurveeditorsubgroup.h"
#include "rtimage.h"
#include "options.h"
+#include "popuptogglebutton.h"
#include "../rtengine/curves.h"
diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h
index 4308e938a..d20a96acd 100644
--- a/rtgui/flatfield.h
+++ b/rtgui/flatfield.h
@@ -42,7 +42,7 @@ public:
// add other info here
};
-class FlatField : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::FlatFieldAutoClipListener
+class FlatField final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::FlatFieldAutoClipListener
{
protected:
diff --git a/rtgui/gradient.h b/rtgui/gradient.h
index 834f08670..f2be47ccc 100644
--- a/rtgui/gradient.h
+++ b/rtgui/gradient.h
@@ -10,7 +10,7 @@
#include "guiutils.h"
#include "toolpanel.h"
-class Gradient :
+class Gradient final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel,
diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc
index b570a23ac..ee3eb90a7 100644
--- a/rtgui/hsvequalizer.cc
+++ b/rtgui/hsvequalizer.cc
@@ -18,6 +18,8 @@
*/
#include "hsvequalizer.h"
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "options.h"
#include "../rtengine/color.h"
diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h
index 7d313cc76..987fd20b2 100644
--- a/rtgui/hsvequalizer.h
+++ b/rtgui/hsvequalizer.h
@@ -22,12 +22,15 @@
#include "adjuster.h"
#include "colorprovider.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "guiutils.h"
#include "toolpanel.h"
-class HSVEqualizer :
+class CurveEditor;
+class CurveEditorGroup;
+class FlatCurveEditor;
+
+class HSVEqualizer final :
public ToolParamBlock,
public FoldableToolPanel,
public CurveListener,
diff --git a/rtgui/icmpanel.h b/rtgui/icmpanel.h
index 5573bacb8..cc46c5d37 100644
--- a/rtgui/icmpanel.h
+++ b/rtgui/icmpanel.h
@@ -36,7 +36,7 @@ public:
virtual void saveInputICCReference(const Glib::ustring& fname, bool apply_wb) = 0;
};
-class ICMPanel :
+class ICMPanel final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/imageareatoollistener.h b/rtgui/imageareatoollistener.h
index 3c753a5e0..b022aa4b7 100644
--- a/rtgui/imageareatoollistener.h
+++ b/rtgui/imageareatoollistener.h
@@ -18,10 +18,9 @@
*/
#pragma once
-#include "cropguilistener.h"
-#include "toolbar.h"
-
+class CropGUIListener;
class Thumbnail;
+class ToolBar;
class ImageAreaToolListener
{
diff --git a/rtgui/impulsedenoise.h b/rtgui/impulsedenoise.h
index e3cfc619a..b8acafcfc 100644
--- a/rtgui/impulsedenoise.h
+++ b/rtgui/impulsedenoise.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class ImpulseDenoise :
+class ImpulseDenoise final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc
index bd4b27f14..491b02c4c 100644
--- a/rtgui/labcurve.cc
+++ b/rtgui/labcurve.cc
@@ -20,6 +20,8 @@
#include "labcurve.h"
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "options.h"
#include "../rtengine/color.h"
diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h
index 46f506d68..e8488a8c6 100644
--- a/rtgui/labcurve.h
+++ b/rtgui/labcurve.h
@@ -22,13 +22,15 @@
#include "adjuster.h"
#include "colorprovider.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "toolpanel.h"
+class CurveEditorGroup;
+class DiagonalCurveEditor;
class EditDataProvider;
+class FlatCurveEditor;
-class LCurve :
+class LCurve final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel,
diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h
index 227b4cacc..4693c897c 100644
--- a/rtgui/labgrid.h
+++ b/rtgui/labgrid.h
@@ -43,7 +43,7 @@
#include "toolpanel.h"
-class LabGridArea: public Gtk::DrawingArea, public BackBuffer {
+class LabGridArea final : public Gtk::DrawingArea, public BackBuffer {
private:
rtengine::ProcEvent evt;
Glib::ustring evtMsg;
diff --git a/rtgui/lensgeom.h b/rtgui/lensgeom.h
index e3352a506..18b31a619 100644
--- a/rtgui/lensgeom.h
+++ b/rtgui/lensgeom.h
@@ -23,7 +23,7 @@
#include "lensgeomlistener.h"
#include "toolpanel.h"
-class LensGeometry :
+class LensGeometry final :
public ToolParamBlock,
public FoldableToolPanel
{
diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h
index 7e740e26e..7b5b7343c 100644
--- a/rtgui/lensprofile.h
+++ b/rtgui/lensprofile.h
@@ -21,7 +21,6 @@
#include
#include "guiutils.h"
-#include "lensgeom.h"
#include "toolpanel.h"
class LensProfilePanel final :
diff --git a/rtgui/localcontrast.h b/rtgui/localcontrast.h
index b23bac697..d1d25fb3d 100644
--- a/rtgui/localcontrast.h
+++ b/rtgui/localcontrast.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class LocalContrast: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
+class LocalContrast final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
{
private:
Adjuster *radius;
diff --git a/rtgui/pcvignette.h b/rtgui/pcvignette.h
index da0e02dc6..87915703f 100644
--- a/rtgui/pcvignette.h
+++ b/rtgui/pcvignette.h
@@ -8,7 +8,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class PCVignette :
+class PCVignette final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/perspective.h b/rtgui/perspective.h
index 618ad32cf..0564479de 100644
--- a/rtgui/perspective.h
+++ b/rtgui/perspective.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class PerspCorrection :
+class PerspCorrection final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/pparamschangelistener.h b/rtgui/pparamschangelistener.h
index 56ac5f605..e255b9657 100644
--- a/rtgui/pparamschangelistener.h
+++ b/rtgui/pparamschangelistener.h
@@ -18,10 +18,14 @@
*/
#pragma once
-#include
-
struct ParamsEdited;
+namespace Glib
+{
+
+class ustring;
+
+}
namespace rtengine
{
diff --git a/rtgui/preprocess.h b/rtgui/preprocess.h
index 3b337a450..d10ff5223 100644
--- a/rtgui/preprocess.h
+++ b/rtgui/preprocess.h
@@ -24,7 +24,7 @@
#include "guiutils.h"
#include "toolpanel.h"
-class PreProcess :
+class PreProcess final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/profilechangelistener.h b/rtgui/profilechangelistener.h
index 58c565393..656566867 100644
--- a/rtgui/profilechangelistener.h
+++ b/rtgui/profilechangelistener.h
@@ -18,8 +18,12 @@
*/
#pragma once
-#include
+namespace Glib
+{
+class ustring;
+
+}
namespace rtengine
{
diff --git a/rtgui/prsharpening.h b/rtgui/prsharpening.h
index 54f2f8063..9738a5cd4 100644
--- a/rtgui/prsharpening.h
+++ b/rtgui/prsharpening.h
@@ -24,7 +24,7 @@
#include "thresholdadjuster.h"
#include "toolpanel.h"
-class PrSharpening :
+class PrSharpening final :
public ToolParamBlock,
public ThresholdAdjusterListener,
public AdjusterListener,
diff --git a/rtgui/rawcacorrection.h b/rtgui/rawcacorrection.h
index 60c705b19..3c95602a7 100644
--- a/rtgui/rawcacorrection.h
+++ b/rtgui/rawcacorrection.h
@@ -24,7 +24,7 @@
#include "checkbox.h"
#include "toolpanel.h"
-class RAWCACorr :
+class RAWCACorr final:
public ToolParamBlock,
public AdjusterListener,
public CheckBoxListener,
diff --git a/rtgui/rawexposure.h b/rtgui/rawexposure.h
index 75b3a9330..33c897113 100644
--- a/rtgui/rawexposure.h
+++ b/rtgui/rawexposure.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class RAWExposure :
+class RAWExposure final:
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
@@ -32,8 +32,6 @@ class RAWExposure :
protected:
Adjuster* PexPos;
-private:
-// Gtk::CheckButton* PextwoGreen;
public:
RAWExposure ();
diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc
index 33f1c2f6a..c78be375f 100644
--- a/rtgui/retinex.cc
+++ b/rtgui/retinex.cc
@@ -2,6 +2,9 @@
* This file is part of RawTherapee.
*/
#include "retinex.h"
+
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "mycurve.h"
#include "rtimage.h"
#include "options.h"
diff --git a/rtgui/retinex.h b/rtgui/retinex.h
index c82c01d3e..ff524f854 100644
--- a/rtgui/retinex.h
+++ b/rtgui/retinex.h
@@ -7,13 +7,18 @@
#include "adjuster.h"
#include "colorprovider.h"
-#include "curveeditor.h"
+#include "curvelistener.h"
#include "curveeditorgroup.h"
#include "guiutils.h"
#include "thresholdadjuster.h"
#include "toolpanel.h"
-class Retinex :
+class CurveEditor;
+class CurveEditorGroup;
+class DiagonalCurveEditor;
+class FlatCurveEditor;
+
+class Retinex final :
public ToolParamBlock,
public FoldableToolPanel,
public rtengine::RetinexListener,
diff --git a/rtgui/rgbcurves.cc b/rtgui/rgbcurves.cc
index 7af6cab97..d501cf449 100644
--- a/rtgui/rgbcurves.cc
+++ b/rtgui/rgbcurves.cc
@@ -18,6 +18,8 @@
*/
#include "rgbcurves.h"
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "options.h"
#include "../rtengine/procparams.h"
diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h
index b73aa22b7..5ed2ea540 100644
--- a/rtgui/rgbcurves.h
+++ b/rtgui/rgbcurves.h
@@ -22,11 +22,13 @@
#include "adjuster.h"
#include "colorprovider.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "toolpanel.h"
-class RGBCurves :
+class CurveEditorGroup;
+class DiagonalCurveEditor;
+
+class RGBCurves final :
public ToolParamBlock,
public FoldableToolPanel,
public CurveListener,
diff --git a/rtgui/rotate.cc b/rtgui/rotate.cc
index 7436186c3..06c53cd4e 100644
--- a/rtgui/rotate.cc
+++ b/rtgui/rotate.cc
@@ -21,6 +21,7 @@
#include "rotate.h"
#include "guiutils.h"
+#include "lensgeomlistener.h"
#include "rtimage.h"
#include "../rtengine/procparams.h"
diff --git a/rtgui/rotate.h b/rtgui/rotate.h
index 5730fd481..41e10eb4d 100644
--- a/rtgui/rotate.h
+++ b/rtgui/rotate.h
@@ -21,10 +21,10 @@
#include
#include "adjuster.h"
-#include "lensgeomlistener.h"
#include "toolpanel.h"
-class Rotate :
+class LensGeomListener;
+class Rotate final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc
index 703ddd96a..064aac1a8 100644
--- a/rtgui/rtwindow.cc
+++ b/rtgui/rtwindow.cc
@@ -29,6 +29,7 @@
#include "whitebalance.h"
#include "../rtengine/settings.h"
#include "batchqueuepanel.h"
+#include "batchqueueentry.h"
#include "editorpanel.h"
#include "filepanel.h"
#include "filmsimulation.h"
diff --git a/rtgui/sensorbayer.h b/rtgui/sensorbayer.h
index 3d6018181..2401bf760 100644
--- a/rtgui/sensorbayer.h
+++ b/rtgui/sensorbayer.h
@@ -22,7 +22,7 @@
#include "toolpanel.h"
-class SensorBayer :
+class SensorBayer final :
public ToolParamBlock,
public FoldableToolPanel
{
diff --git a/rtgui/sensorxtrans.h b/rtgui/sensorxtrans.h
index c1cacb2f4..eee014f6c 100644
--- a/rtgui/sensorxtrans.h
+++ b/rtgui/sensorxtrans.h
@@ -22,7 +22,7 @@
#include "toolpanel.h"
-class SensorXTrans :
+class SensorXTrans final:
public ToolParamBlock,
public FoldableToolPanel
{
diff --git a/rtgui/shadowshighlights.h b/rtgui/shadowshighlights.h
index 4f3ee7577..7bb0bb01c 100644
--- a/rtgui/shadowshighlights.h
+++ b/rtgui/shadowshighlights.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class ShadowsHighlights :
+class ShadowsHighlights final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/sharpenedge.h b/rtgui/sharpenedge.h
index 46a528153..a813d86e1 100644
--- a/rtgui/sharpenedge.h
+++ b/rtgui/sharpenedge.h
@@ -28,7 +28,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class SharpenEdge :
+class SharpenEdge final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/sharpening.h b/rtgui/sharpening.h
index e922e82c7..bd5e6f1b7 100644
--- a/rtgui/sharpening.h
+++ b/rtgui/sharpening.h
@@ -24,7 +24,7 @@
#include "thresholdadjuster.h"
#include "toolpanel.h"
-class Sharpening :
+class Sharpening final:
public ToolParamBlock,
public ThresholdAdjusterListener,
public AdjusterListener,
diff --git a/rtgui/sharpenmicro.h b/rtgui/sharpenmicro.h
index 3120e6e7b..23224dd60 100644
--- a/rtgui/sharpenmicro.h
+++ b/rtgui/sharpenmicro.h
@@ -28,7 +28,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class SharpenMicro :
+class SharpenMicro final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/softlight.h b/rtgui/softlight.h
index a584d3a73..710da4e34 100644
--- a/rtgui/softlight.h
+++ b/rtgui/softlight.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class SoftLight: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
+class SoftLight final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel
{
private:
Adjuster *strength;
diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc
index 2774cd206..c9329cf91 100644
--- a/rtgui/thumbbrowserbase.cc
+++ b/rtgui/thumbbrowserbase.cc
@@ -23,6 +23,7 @@
#include "options.h"
#include "rtscalable.h"
#include "thumbbrowserbase.h"
+#include "thumbbrowserentrybase.h"
#include "../rtengine/rt_math.h"
diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h
index 5a55aeeca..d6bafaf69 100644
--- a/rtgui/thumbbrowserbase.h
+++ b/rtgui/thumbbrowserbase.h
@@ -24,13 +24,13 @@
#include "guiutils.h"
#include "options.h"
-#include "thumbbrowserentrybase.h"
/*
* Class handling the list of ThumbBrowserEntry objects and their position in it's allocated space
*/
class Inspector;
+class ThumbBrowserEntryBase;
class ThumbBrowserBase :
public Gtk::Grid
diff --git a/rtgui/thumbimageupdater.cc b/rtgui/thumbimageupdater.cc
index bf230fe63..03606bb3d 100644
--- a/rtgui/thumbimageupdater.cc
+++ b/rtgui/thumbimageupdater.cc
@@ -23,6 +23,7 @@
#include
#include "thumbimageupdater.h"
+#include "thumbbrowserentrybase.h"
#include "guiutils.h"
#include "threadutils.h"
diff --git a/rtgui/thumbimageupdater.h b/rtgui/thumbimageupdater.h
index cdf65bd62..a2e2ecb19 100644
--- a/rtgui/thumbimageupdater.h
+++ b/rtgui/thumbimageupdater.h
@@ -20,7 +20,6 @@
#include
-#include "thumbbrowserentrybase.h"
#include "../rtengine/noncopyable.h"
@@ -36,6 +35,9 @@ namespace procparams
}
}
+
+class ThumbBrowserEntryBase;
+
class ThumbImageUpdateListener
{
public:
diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc
index 68f3ee4de..dc9b17fa9 100644
--- a/rtgui/tonecurve.cc
+++ b/rtgui/tonecurve.cc
@@ -23,6 +23,8 @@
#include "tonecurve.h"
#include "adjuster.h"
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "eventmapper.h"
#include "ppversion.h"
#include "options.h"
diff --git a/rtgui/tonecurve.h b/rtgui/tonecurve.h
index cba810e15..e0482c5da 100644
--- a/rtgui/tonecurve.h
+++ b/rtgui/tonecurve.h
@@ -21,14 +21,16 @@
#include
#include "adjuster.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "guiutils.h"
#include "toolpanel.h"
+class CurveEditor;
+class CurveEditorGroup;
+class DiagonalCurveEditor;
class EditDataProvider;
-class ToneCurve :
+class ToneCurve final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel,
diff --git a/rtgui/toolbar.h b/rtgui/toolbar.h
index 55901d3dc..14177dc24 100644
--- a/rtgui/toolbar.h
+++ b/rtgui/toolbar.h
@@ -37,7 +37,7 @@ public:
virtual void editModeSwitchedOff() = 0;
};
-class ToolBar : public Gtk::HBox
+class ToolBar final : public Gtk::HBox
{
private:
std::unique_ptr handimg;
diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h
index 627200835..0f002e048 100644
--- a/rtgui/toolpanel.h
+++ b/rtgui/toolpanel.h
@@ -41,9 +41,6 @@ class ProcParams;
}
}
-class FoldableToolPanel;
-class ToolPanel;
-
class ToolPanelListener
{
public:
diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc
index 504eabc27..5b5f756a3 100644
--- a/rtgui/toolpanelcoord.cc
+++ b/rtgui/toolpanelcoord.cc
@@ -21,6 +21,7 @@
#include "metadatapanel.h"
#include "options.h"
#include "rtimage.h"
+
#include "../rtengine/imagesource.h"
#include "../rtengine/dfmanager.h"
#include "../rtengine/ffmanager.h"
diff --git a/rtgui/vibrance.cc b/rtgui/vibrance.cc
index 67052785a..4a9fab3d3 100644
--- a/rtgui/vibrance.cc
+++ b/rtgui/vibrance.cc
@@ -18,6 +18,9 @@
*/
#include "vibrance.h"
+
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "options.h"
#include "../rtengine/color.h"
diff --git a/rtgui/vibrance.h b/rtgui/vibrance.h
index 211f631f9..12acc7948 100644
--- a/rtgui/vibrance.h
+++ b/rtgui/vibrance.h
@@ -21,12 +21,14 @@
#include
#include "adjuster.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "thresholdadjuster.h"
#include "toolpanel.h"
-class Vibrance :
+class CurveEditorGroup;
+class DiagonalCurveEditor;
+
+class Vibrance final :
public ToolParamBlock,
public AdjusterListener,
public ThresholdCurveProvider,
diff --git a/rtgui/vignetting.h b/rtgui/vignetting.h
index 8cc8c498b..be7765094 100644
--- a/rtgui/vignetting.h
+++ b/rtgui/vignetting.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class Vignetting :
+class Vignetting final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc
index 4fd3a7b8f..3981457e6 100644
--- a/rtgui/wavelet.cc
+++ b/rtgui/wavelet.cc
@@ -20,6 +20,8 @@
#include "wavelet.h"
#include
+#include "curveeditor.h"
+#include "curveeditorgroup.h"
#include "editcallbacks.h"
#include "guiutils.h"
#include "rtimage.h"
diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h
index 20a0ba4e5..6551b58d4 100644
--- a/rtgui/wavelet.h
+++ b/rtgui/wavelet.h
@@ -22,15 +22,18 @@
#include
#include "adjuster.h"
#include "toolpanel.h"
-#include "curveeditor.h"
-#include "curveeditorgroup.h"
+#include "curvelistener.h"
#include "thresholdadjuster.h"
#include "colorprovider.h"
#include "guiutils.h"
+class CurveEditor;
+class CurveEditorGroup;
+class DiagonalCurveEditor;
class EditDataProvider;
+class FlatCurveEditor;
-class Wavelet :
+class Wavelet final :
public ToolParamBlock,
public ThresholdAdjusterListener,
public AdjusterListener,
diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h
index 528c81d17..b4d09f119 100644
--- a/rtgui/whitebalance.h
+++ b/rtgui/whitebalance.h
@@ -35,7 +35,7 @@ public:
virtual void spotWBRequested(int size) = 0;
};
-class WhiteBalance : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoWBListener
+class WhiteBalance final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoWBListener
{
enum WB_LabelType {
diff --git a/rtgui/xtransprocess.h b/rtgui/xtransprocess.h
index b17b56b07..d6cb120e0 100644
--- a/rtgui/xtransprocess.h
+++ b/rtgui/xtransprocess.h
@@ -25,7 +25,7 @@
#include "guiutils.h"
#include "toolpanel.h"
-class XTransProcess :
+class XTransProcess final :
public ToolParamBlock,
public AdjusterListener,
public CheckBoxListener,
diff --git a/rtgui/xtransrawexposure.h b/rtgui/xtransrawexposure.h
index 46c418f2f..a8daf6972 100644
--- a/rtgui/xtransrawexposure.h
+++ b/rtgui/xtransrawexposure.h
@@ -23,7 +23,7 @@
#include "adjuster.h"
#include "toolpanel.h"
-class XTransRAWExposure :
+class XTransRAWExposure final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel