Bigfix (see #4008) :
- CIECam now gets the shot's setting of the selected frame - 'UserComment' metadata now correctly handled - RT prepared to handle XTrans multiframe - SensorType now set in the cache/data files
This commit is contained in:
parent
e97c7cad2c
commit
bb874bcce7
@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
#include "imagedata.h"
|
#include "imagedata.h"
|
||||||
#include "iptcpairs.h"
|
#include "iptcpairs.h"
|
||||||
|
#include "imagesource.h"
|
||||||
|
#include "rt_math.h"
|
||||||
|
|
||||||
#define PRINT_HDR_PS_DETECTION 0
|
#define PRINT_HDR_PS_DETECTION 0
|
||||||
|
|
||||||
@ -791,6 +793,39 @@ rtexif::TagDirectory* FramesData::getFrameExifData (unsigned int frame) const
|
|||||||
return frames.empty() || frame >= frames.size() ? nullptr : frames.at(frame)->getExifData ();
|
return frames.empty() || frame >= frames.size() ? nullptr : frames.at(frame)->getExifData ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rtexif::TagDirectory* FramesData::getBestExifData (ImageSource *imgSource, procparams::RAWParams *rawParams) const
|
||||||
|
{
|
||||||
|
rtexif::TagDirectory *td = nullptr;
|
||||||
|
if (frames.empty()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
if (imgSource && rawParams) {
|
||||||
|
eSensorType sensorType = imgSource->getSensorType();
|
||||||
|
unsigned int imgNum = 0;
|
||||||
|
if (sensorType == ST_BAYER) {
|
||||||
|
imgNum = rtengine::LIM<unsigned int>(rawParams->bayersensor.imageNum, 1, frames.size());
|
||||||
|
/*
|
||||||
|
// might exist someday ?
|
||||||
|
} else if (sensorType == ST_FUJI_XTRANS) {
|
||||||
|
imgNum = rtengine::LIM(rawParams->xtranssensor.imageNum, 1, frames.size());
|
||||||
|
} else if (sensorType == ST_NONE && !imgSource->isRAW()) {
|
||||||
|
// standard image multiframe support should come here (when implemented in GUI)
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
frames[imgNum]->getExifData ();
|
||||||
|
|
||||||
|
td = getFrameExifData (imgNum);
|
||||||
|
rtexif::Tag* makeTag;
|
||||||
|
if (td && (makeTag = td->findTag("Make", true))) {
|
||||||
|
td = makeTag->getParent();
|
||||||
|
} else {
|
||||||
|
td = getRootExifData(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return td;
|
||||||
|
}
|
||||||
|
|
||||||
rtexif::TagDirectory* FramesData::getRootExifData (unsigned int root) const
|
rtexif::TagDirectory* FramesData::getRootExifData (unsigned int root) const
|
||||||
{
|
{
|
||||||
return roots.empty() || root >= roots.size() ? nullptr : roots.at(root);
|
return roots.empty() || root >= roots.size() ? nullptr : roots.at(root);
|
||||||
|
@ -107,6 +107,7 @@ public:
|
|||||||
IIOSampleFormat getSampleFormat (unsigned int frame = 0) const;
|
IIOSampleFormat getSampleFormat (unsigned int frame = 0) const;
|
||||||
rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const;
|
rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const;
|
||||||
rtexif::TagDirectory* getRootExifData (unsigned int root = 0) const;
|
rtexif::TagDirectory* getRootExifData (unsigned int root = 0) const;
|
||||||
|
rtexif::TagDirectory* getBestExifData (ImageSource *imgSource, procparams::RAWParams *rawParams) const;
|
||||||
procparams::IPTCPairs getIPTCData (unsigned int frame = 0) const;
|
procparams::IPTCPairs getIPTCData (unsigned int frame = 0) const;
|
||||||
bool hasExif (unsigned int frame = 0) const;
|
bool hasExif (unsigned int frame = 0) const;
|
||||||
bool hasIPTC (unsigned int frame = 0) const;
|
bool hasIPTC (unsigned int frame = 0) const;
|
||||||
|
@ -732,10 +732,21 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
CurveFactory::curveLightBrightColor (params.colorappearance.curve, params.colorappearance.curve2, params.colorappearance.curve3,
|
CurveFactory::curveLightBrightColor (params.colorappearance.curve, params.colorappearance.curve2, params.colorappearance.curve3,
|
||||||
lhist16CAM, histLCAM, lhist16CCAM, histCCAM,
|
lhist16CAM, histLCAM, lhist16CCAM, histCCAM,
|
||||||
customColCurve1, customColCurve2, customColCurve3, 1);
|
customColCurve1, customColCurve2, customColCurve3, 1);
|
||||||
float fnum = imgsrc->getMetaData()->getFNumber (); // F number
|
|
||||||
float fiso = imgsrc->getMetaData()->getISOSpeed () ; // ISO
|
const FramesMetaData* metaData = imgsrc->getMetaData();
|
||||||
float fspeed = imgsrc->getMetaData()->getShutterSpeed () ; // Speed
|
int imgNum = 0;
|
||||||
double fcomp = imgsrc->getMetaData()->getExpComp (); // Compensation +/-
|
if (imgsrc->isRAW()) {
|
||||||
|
if (imgsrc->getSensorType() == ST_BAYER) {
|
||||||
|
imgNum = rtengine::LIM<unsigned int>(params.raw.bayersensor.imageNum, 0, metaData->getFrameCount() - 1);
|
||||||
|
} else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) {
|
||||||
|
//imgNum = rtengine::LIM<unsigned int>(params.raw.xtranssensor.imageNum, 0, metaData->getFrameCount() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float fnum = metaData->getFNumber (imgNum); // F number
|
||||||
|
float fiso = metaData->getISOSpeed (imgNum) ; // ISO
|
||||||
|
float fspeed = metaData->getShutterSpeed (imgNum) ; // Speed
|
||||||
|
double fcomp = metaData->getExpComp (imgNum); // Compensation +/-
|
||||||
double adap;
|
double adap;
|
||||||
|
|
||||||
if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { //if no exif data or wrong
|
if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { //if no exif data or wrong
|
||||||
|
@ -7063,13 +7063,14 @@ double ImProcFunctions::getAutoDistor (const Glib::ustring &fname, int thumb_si
|
|||||||
int w_raw = -1, h_raw = thumb_size;
|
int w_raw = -1, h_raw = thumb_size;
|
||||||
int w_thumb = -1, h_thumb = thumb_size;
|
int w_thumb = -1, h_thumb = thumb_size;
|
||||||
|
|
||||||
Thumbnail* thumb = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, w_thumb, h_thumb, 1, FALSE);
|
eSensorType sensorType = rtengine::ST_NONE;
|
||||||
|
Thumbnail* thumb = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, sensorType, w_thumb, h_thumb, 1, FALSE);
|
||||||
|
|
||||||
if (!thumb) {
|
if (!thumb) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, w_raw, h_raw, 1, 1.0, FALSE, 0);
|
Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, w_raw, h_raw, 1, 1.0, FALSE, 0);
|
||||||
|
|
||||||
if (!raw) {
|
if (!raw) {
|
||||||
delete thumb;
|
delete thumb;
|
||||||
|
@ -59,7 +59,8 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rtengine::RawMetaDataLocation ri;
|
rtengine::RawMetaDataLocation ri;
|
||||||
tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, width, height, 1, true, true);
|
eSensorType sensorType = rtengine::ST_NONE;
|
||||||
|
tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, sensorType, width, height, 1, true, true);
|
||||||
|
|
||||||
if (tpp) {
|
if (tpp) {
|
||||||
data = tpp->getImage8Data();
|
data = tpp->getImage8Data();
|
||||||
|
@ -48,7 +48,7 @@ namespace rtengine
|
|||||||
class IImage8;
|
class IImage8;
|
||||||
class IImage16;
|
class IImage16;
|
||||||
class IImagefloat;
|
class IImagefloat;
|
||||||
|
class ImageSource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class provides functions to obtain exif and IPTC metadata information
|
* This class provides functions to obtain exif and IPTC metadata information
|
||||||
@ -74,6 +74,12 @@ public:
|
|||||||
* @param frame frame number in the metadata tree
|
* @param frame frame number in the metadata tree
|
||||||
* @return The directory of exif metadata tags */
|
* @return The directory of exif metadata tags */
|
||||||
virtual rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const = 0;
|
virtual rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const = 0;
|
||||||
|
/** Returns the directory of exif metadata tags containing at least the 'Make' tag for the requested frame.
|
||||||
|
* If no usable metadata exist in the frame, send back the best TagDirectory describing the frame content.
|
||||||
|
* @param imgSource rawimage that we want the metadata from
|
||||||
|
* @param rawParams RawParams to select the frame number
|
||||||
|
* @return The directory of exif metadata tags containing at least the 'Make' tag */
|
||||||
|
virtual rtexif::TagDirectory* getBestExifData (ImageSource *imgSource, procparams::RAWParams *rawParams) const = 0;
|
||||||
/** Checks the availability of IPTC tags.
|
/** Checks the availability of IPTC tags.
|
||||||
* @return Returns true if image contains IPTC tags */
|
* @return Returns true if image contains IPTC tags */
|
||||||
virtual bool hasIPTC (unsigned int frame = 0) const = 0;
|
virtual bool hasIPTC (unsigned int frame = 0) const = 0;
|
||||||
|
@ -247,7 +247,7 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h,
|
|||||||
return tpp;
|
return tpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, bool rotate, bool inspectorMode)
|
Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, bool rotate, bool inspectorMode)
|
||||||
{
|
{
|
||||||
RawImage *ri = new RawImage (fname);
|
RawImage *ri = new RawImage (fname);
|
||||||
unsigned int imageNum = 0;
|
unsigned int imageNum = 0;
|
||||||
@ -255,9 +255,12 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL
|
|||||||
|
|
||||||
if ( r ) {
|
if ( r ) {
|
||||||
delete ri;
|
delete ri;
|
||||||
|
sensorType = ST_NONE;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sensorType = ri->getSensorType();
|
||||||
|
|
||||||
rml.exifBase = ri->get_exifBase();
|
rml.exifBase = ri->get_exifBase();
|
||||||
rml.ciffBase = ri->get_ciffBase();
|
rml.ciffBase = ri->get_ciffBase();
|
||||||
rml.ciffLength = ri->get_ciffLen();
|
rml.ciffLength = ri->get_ciffLen();
|
||||||
@ -378,7 +381,7 @@ RawMetaDataLocation Thumbnail::loadMetaDataFromRaw (const Glib::ustring& fname)
|
|||||||
return rml;
|
return rml;
|
||||||
}
|
}
|
||||||
|
|
||||||
Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum)
|
Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum)
|
||||||
{
|
{
|
||||||
RawImage *ri = new RawImage (fname);
|
RawImage *ri = new RawImage (fname);
|
||||||
unsigned int tempImageNum = 0;
|
unsigned int tempImageNum = 0;
|
||||||
@ -387,9 +390,12 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati
|
|||||||
|
|
||||||
if ( r ) {
|
if ( r ) {
|
||||||
delete ri;
|
delete ri;
|
||||||
|
sensorType = ST_NONE;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sensorType = ri->getSensorType();
|
||||||
|
|
||||||
int width = ri->get_width();
|
int width = ri->get_width();
|
||||||
int height = ri->get_height();
|
int height = ri->get_height();
|
||||||
rtengine::Thumbnail* tpp = new rtengine::Thumbnail;
|
rtengine::Thumbnail* tpp = new rtengine::Thumbnail;
|
||||||
@ -954,11 +960,15 @@ IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Full thumbnail processing, second stage if complete profile exists
|
// Full thumbnail processing, second stage if complete profile exists
|
||||||
IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& myscale)
|
IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& myscale)
|
||||||
{
|
{
|
||||||
int imgNum = 1;
|
unsigned int imgNum = 0;
|
||||||
if (isRaw) {
|
if (isRaw) {
|
||||||
|
if (sensorType == ST_BAYER) {
|
||||||
imgNum = rtengine::LIM<unsigned int>(params.raw.bayersensor.imageNum, 0, metadata->getFrameCount() - 1);
|
imgNum = rtengine::LIM<unsigned int>(params.raw.bayersensor.imageNum, 0, metadata->getFrameCount() - 1);
|
||||||
|
} else if (sensorType == ST_FUJI_XTRANS) {
|
||||||
|
//imgNum = rtengine::LIM<unsigned int>(params.raw.xtranssensor.imageNum, 0, metadata->getFrameCount() - 1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
std::string camName = metadata->getCamera(imgNum);
|
std::string camName = metadata->getCamera(imgNum);
|
||||||
float shutter = metadata->getShutterSpeed(imgNum);
|
float shutter = metadata->getShutterSpeed(imgNum);
|
||||||
|
@ -71,13 +71,13 @@ public:
|
|||||||
|
|
||||||
void init ();
|
void init ();
|
||||||
|
|
||||||
IImage8* processImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& scale);
|
IImage8* processImage (const procparams::ProcParams& pparams, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& scale);
|
||||||
IImage8* quickProcessImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, double& scale);
|
IImage8* quickProcessImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, double& scale);
|
||||||
int getImageWidth (const procparams::ProcParams& pparams, int rheight, float &ratio);
|
int getImageWidth (const procparams::ProcParams& pparams, int rheight, float &ratio);
|
||||||
void getDimensions (int& w, int& h, double& scaleFac);
|
void getDimensions (int& w, int& h, double& scaleFac);
|
||||||
|
|
||||||
static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int &w, int &h, int fixwh, bool rotate, bool inspectorMode = false);
|
static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, bool rotate, bool inspectorMode = false);
|
||||||
static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum);
|
static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum);
|
||||||
static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode = false);
|
static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode = false);
|
||||||
static RawMetaDataLocation loadMetaDataFromRaw (const Glib::ustring& fname);
|
static RawMetaDataLocation loadMetaDataFromRaw (const Glib::ustring& fname);
|
||||||
|
|
||||||
|
@ -1109,10 +1109,16 @@ private:
|
|||||||
|
|
||||||
if (params.colorappearance.enabled) {
|
if (params.colorappearance.enabled) {
|
||||||
double adap;
|
double adap;
|
||||||
float fnum = imgsrc->getMetaData()->getFNumber ();// F number
|
int imgNum = 0;
|
||||||
float fiso = imgsrc->getMetaData()->getISOSpeed () ;// ISO
|
if (imgsrc->getSensorType() == ST_BAYER) {
|
||||||
float fspeed = imgsrc->getMetaData()->getShutterSpeed () ;//speed
|
imgNum = params.raw.bayersensor.imageNum;
|
||||||
float fcomp = imgsrc->getMetaData()->getExpComp ();//compensation + -
|
} else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) {
|
||||||
|
//imgNum = params.raw.xtranssensor.imageNum;
|
||||||
|
}
|
||||||
|
float fnum = imgsrc->getMetaData()->getFNumber (imgNum); // F number
|
||||||
|
float fiso = imgsrc->getMetaData()->getISOSpeed (imgNum) ; // ISO
|
||||||
|
float fspeed = imgsrc->getMetaData()->getShutterSpeed (imgNum) ; //speed
|
||||||
|
float fcomp = imgsrc->getMetaData()->getExpComp (imgNum); //compensation + -
|
||||||
|
|
||||||
if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) {
|
if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) {
|
||||||
adap = 2000.;
|
adap = 2000.;
|
||||||
@ -1285,9 +1291,12 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tunnelMetaData) {
|
if (tunnelMetaData) {
|
||||||
|
// Sending back the whole first root, which won't necessarily be the selected frame number
|
||||||
|
// and may contain subframe depending on initial raw's hierarchy
|
||||||
readyImg->setMetadata (ii->getMetaData()->getRootExifData ());
|
readyImg->setMetadata (ii->getMetaData()->getRootExifData ());
|
||||||
} else {
|
} else {
|
||||||
readyImg->setMetadata (ii->getMetaData()->getRootExifData (), params.exif, params.iptc);
|
// ask for the correct frame number, but may contain subframe depending on initial raw's hierarchy
|
||||||
|
readyImg->setMetadata (ii->getMetaData()->getBestExifData(imgsrc, ¶ms.raw), params.exif, params.iptc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <tiff.h>
|
#include <tiff.h>
|
||||||
|
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
|
#include <glib/gunicode.h>
|
||||||
|
|
||||||
#include "rtexif.h"
|
#include "rtexif.h"
|
||||||
|
|
||||||
@ -707,7 +708,7 @@ int TagDirectory::write (int start, unsigned char* buffer)
|
|||||||
return maxPos;
|
return maxPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TagDirectory::applyChange (std::string name, std::string value)
|
void TagDirectory::applyChange (std::string name, Glib::ustring value)
|
||||||
{
|
{
|
||||||
|
|
||||||
std::string::size_type dp = name.find_first_of ('.');
|
std::string::size_type dp = name.find_first_of ('.');
|
||||||
@ -741,7 +742,12 @@ void TagDirectory::applyChange (std::string name, std::string value)
|
|||||||
|
|
||||||
if (attrib) {
|
if (attrib) {
|
||||||
Tag* nt = new Tag (this, attrib);
|
Tag* nt = new Tag (this, attrib);
|
||||||
|
if (name == "UserComment") {
|
||||||
|
// UserComment can be Unicode
|
||||||
|
nt->initUserComment (value);
|
||||||
|
} else {
|
||||||
nt->initString (value.c_str());
|
nt->initString (value.c_str());
|
||||||
|
}
|
||||||
addTag (nt);
|
addTag (nt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1907,6 +1913,28 @@ void Tag::initInt (int data, TagType t, int cnt)
|
|||||||
setInt (data, 0, t);
|
setInt (data, 0, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Tag::initUserComment (const Glib::ustring &text)
|
||||||
|
{
|
||||||
|
type = UNDEFINED;
|
||||||
|
if (text.is_ascii()) {
|
||||||
|
count = 8 + strlen (text.c_str());
|
||||||
|
valuesize = count;
|
||||||
|
value = new unsigned char[valuesize];
|
||||||
|
strcpy ((char*)value, "ASCII");
|
||||||
|
value[5] = value[6] = value[7] = 0;
|
||||||
|
strcpy ((char*)value + 8, text.c_str());
|
||||||
|
} else {
|
||||||
|
wchar_t *commentStr = (wchar_t*)g_utf8_to_utf16 (text.c_str(), -1, NULL, NULL, NULL);
|
||||||
|
count = 8 + wcslen(commentStr)*2;
|
||||||
|
valuesize = count;
|
||||||
|
value = (unsigned char*)new char[valuesize];
|
||||||
|
strcpy ((char*)value, "UNICODE");
|
||||||
|
value[7] = 0;
|
||||||
|
wcscpy(((wchar_t*)value) + 4, commentStr);
|
||||||
|
g_free(commentStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Tag::initString (const char* text)
|
void Tag::initString (const char* text)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ public:
|
|||||||
virtual int calculateSize ();
|
virtual int calculateSize ();
|
||||||
virtual int write (int start, unsigned char* buffer);
|
virtual int write (int start, unsigned char* buffer);
|
||||||
virtual TagDirectory* clone (TagDirectory* parent);
|
virtual TagDirectory* clone (TagDirectory* parent);
|
||||||
virtual void applyChange (std::string field, std::string value);
|
virtual void applyChange (std::string field, Glib::ustring value);
|
||||||
|
|
||||||
virtual void printAll (unsigned int level = 0) const; // reentrant debug function, keep level=0 on first call !
|
virtual void printAll (unsigned int level = 0) const; // reentrant debug function, keep level=0 on first call !
|
||||||
virtual bool CPBDump (const Glib::ustring &commFName, const Glib::ustring &imageFName, const Glib::ustring &profileFName, const Glib::ustring &defaultPParams,
|
virtual bool CPBDump (const Glib::ustring &commFName, const Glib::ustring &imageFName, const Glib::ustring &profileFName, const Glib::ustring &defaultPParams,
|
||||||
@ -227,6 +227,7 @@ public:
|
|||||||
~Tag ();
|
~Tag ();
|
||||||
void initType (unsigned char *data, TagType type);
|
void initType (unsigned char *data, TagType type);
|
||||||
void initInt (int data, TagType t, int count = 1);
|
void initInt (int data, TagType t, int count = 1);
|
||||||
|
void initUserComment (const Glib::ustring &text);
|
||||||
void initString (const char* text);
|
void initString (const char* text);
|
||||||
void initSubDir ();
|
void initSubDir ();
|
||||||
void initSubDir (TagDirectory* dir);
|
void initSubDir (TagDirectory* dir);
|
||||||
|
@ -25,8 +25,9 @@
|
|||||||
CacheImageData::CacheImageData ()
|
CacheImageData::CacheImageData ()
|
||||||
: md5(""), supported(false), format(FT_Invalid), rankOld(-1), inTrashOld(false), recentlySaved(false),
|
: md5(""), supported(false), format(FT_Invalid), rankOld(-1), inTrashOld(false), recentlySaved(false),
|
||||||
timeValid(false), year(0), month(0), day(0), hour(0), min(0), sec(0), exifValid(false), frameCount(1),
|
timeValid(false), year(0), month(0), day(0), hour(0), min(0), sec(0), exifValid(false), frameCount(1),
|
||||||
fnumber(0.0), shutter(0.0), focalLen(0.0), focalLen35mm(0.0), focusDist(0.f), iso(0), isHDR (false), isPixelShift (false),
|
fnumber(0.0), shutter(0.0), focalLen(0.0), focalLen35mm(0.0), focusDist(0.f), iso(0), isHDR (false),
|
||||||
sampleFormat(rtengine::IIOSF_UNKNOWN), redAWBMul(-1.0), greenAWBMul(-1.0), blueAWBMul(-1.0), rotate(0), thumbImgType(0)
|
isPixelShift (false), sensortype(rtengine::ST_NONE), sampleFormat(rtengine::IIOSF_UNKNOWN),
|
||||||
|
redAWBMul(-1.0), greenAWBMul(-1.0), blueAWBMul(-1.0), rotate(0), thumbImgType(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,6 +181,9 @@ int CacheImageData::load (const Glib::ustring& fname)
|
|||||||
if (keyFile.has_key ("ExtraRawInfo", "ThumbImageType")) {
|
if (keyFile.has_key ("ExtraRawInfo", "ThumbImageType")) {
|
||||||
thumbImgType = keyFile.get_integer ("ExtraRawInfo", "ThumbImageType");
|
thumbImgType = keyFile.get_integer ("ExtraRawInfo", "ThumbImageType");
|
||||||
}
|
}
|
||||||
|
if (keyFile.has_key ("ExtraRawInfo", "SensorType")) {
|
||||||
|
sensortype = keyFile.get_integer ("ExtraRawInfo", "SensorType");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
rotate = 0;
|
rotate = 0;
|
||||||
thumbImgType = 0;
|
thumbImgType = 0;
|
||||||
@ -263,6 +267,7 @@ int CacheImageData::save (const Glib::ustring& fname)
|
|||||||
|
|
||||||
if (format == FT_Raw) {
|
if (format == FT_Raw) {
|
||||||
keyFile.set_integer ("ExtraRawInfo", "ThumbImageType", thumbImgType);
|
keyFile.set_integer ("ExtraRawInfo", "ThumbImageType", thumbImgType);
|
||||||
|
keyFile.set_integer ("ExtraRawInfo", "SensorType", sensortype);
|
||||||
}
|
}
|
||||||
|
|
||||||
keyData = keyFile.to_data ();
|
keyData = keyFile.to_data ();
|
||||||
|
@ -56,6 +56,7 @@ public:
|
|||||||
unsigned iso;
|
unsigned iso;
|
||||||
bool isHDR;
|
bool isHDR;
|
||||||
bool isPixelShift;
|
bool isPixelShift;
|
||||||
|
int sensortype;
|
||||||
rtengine::IIO_Sample_Format sampleFormat;
|
rtengine::IIO_Sample_Format sampleFormat;
|
||||||
Glib::ustring lens;
|
Glib::ustring lens;
|
||||||
Glib::ustring camMake;
|
Glib::ustring camMake;
|
||||||
@ -91,6 +92,7 @@ public:
|
|||||||
bool hasExif (unsigned int frame = 0) const { return false; }
|
bool hasExif (unsigned int frame = 0) const { return false; }
|
||||||
rtexif::TagDirectory* getRootExifData (unsigned int root = 0) const { return nullptr; }
|
rtexif::TagDirectory* getRootExifData (unsigned int root = 0) const { return nullptr; }
|
||||||
rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const { return nullptr; }
|
rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const { return nullptr; }
|
||||||
|
rtexif::TagDirectory* getBestExifData (rtengine::ImageSource *imgSource, rtengine::procparams::RAWParams *rawParams) const { return nullptr; }
|
||||||
bool hasIPTC (unsigned int frame = 0) const { return false; }
|
bool hasIPTC (unsigned int frame = 0) const { return false; }
|
||||||
rtengine::procparams::IPTCPairs getIPTCData (unsigned int frame = 0) const { return rtengine::procparams::IPTCPairs(); }
|
rtengine::procparams::IPTCPairs getIPTCData (unsigned int frame = 0) const { return rtengine::procparams::IPTCPairs(); }
|
||||||
tm getDateTime (unsigned int frame = 0) const { return tm{}; }
|
tm getDateTime (unsigned int frame = 0) const { return tm{}; }
|
||||||
|
@ -1143,7 +1143,16 @@ void EditorPanel::procParamsChanged (rtengine::procparams::ProcParams* params, r
|
|||||||
// if (ev!=EvPhotoLoaded)
|
// if (ev!=EvPhotoLoaded)
|
||||||
// saveLabel->set_markup (Glib::ustring("<span foreground=\"#AA0000\" weight=\"bold\">") + M("MAIN_BUTTON_SAVE") + "</span>");
|
// saveLabel->set_markup (Glib::ustring("<span foreground=\"#AA0000\" weight=\"bold\">") + M("MAIN_BUTTON_SAVE") + "</span>");
|
||||||
|
|
||||||
|
rtengine::eSensorType sensorType = isrc->getImageSource()->getSensorType();
|
||||||
|
|
||||||
|
selectedFrame = 0;
|
||||||
|
if (sensorType == rtengine::ST_BAYER) {
|
||||||
selectedFrame = params->raw.bayersensor.imageNum;
|
selectedFrame = params->raw.bayersensor.imageNum;
|
||||||
|
//} else if (sensorType == rtengine::ST_FUJI_XTRANS) {
|
||||||
|
// selectedFrame = params->raw.xtranssensor.imageNum;
|
||||||
|
}
|
||||||
|
selectedFrame = rtengine::LIM<int>(selectedFrame, 0, isrc->getImageSource()->getMetaData()->getFrameCount() - 1);
|
||||||
|
|
||||||
info_toggled();
|
info_toggled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,16 +132,18 @@ void Thumbnail::_generateThumbnailImage ()
|
|||||||
bool quick = false;
|
bool quick = false;
|
||||||
rtengine::RawMetaDataLocation ri;
|
rtengine::RawMetaDataLocation ri;
|
||||||
|
|
||||||
|
rtengine::eSensorType sensorType = rtengine::ST_NONE;
|
||||||
if ( initial_ && options.internalThumbIfUntouched) {
|
if ( initial_ && options.internalThumbIfUntouched) {
|
||||||
quick = true;
|
quick = true;
|
||||||
tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, tw, th, 1, TRUE);
|
tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, sensorType, tw, th, 1, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( tpp == nullptr ) {
|
if ( tpp == nullptr ) {
|
||||||
quick = false;
|
quick = false;
|
||||||
tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, tw, th, 1, pparams.wb.equal, TRUE, pparams.raw.bayersensor.imageNum);
|
tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, tw, th, 1, pparams.wb.equal, TRUE, pparams.raw.bayersensor.imageNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cfs.sensortype = sensorType;
|
||||||
if (tpp) {
|
if (tpp) {
|
||||||
cfs.format = FT_Raw;
|
cfs.format = FT_Raw;
|
||||||
cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL;
|
cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL;
|
||||||
@ -614,7 +616,7 @@ rtengine::IImage8* Thumbnail::processThumbImage (const rtengine::procparams::Pro
|
|||||||
} else {
|
} else {
|
||||||
// Full thumbnail: apply profile
|
// Full thumbnail: apply profile
|
||||||
// image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, cfs.getCamera(), cfs.focalLen, cfs.focalLen35mm, cfs.focusDist, cfs.shutter, cfs.fnumber, cfs.iso, cfs.expcomp, scale );
|
// image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, cfs.getCamera(), cfs.focalLen, cfs.focalLen35mm, cfs.focusDist, cfs.shutter, cfs.fnumber, cfs.iso, cfs.expcomp, scale );
|
||||||
image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, &cfs, scale );
|
image = tpp->processImage (pparams, static_cast<rtengine::eSensorType>(cfs.sensortype), h, rtengine::TI_Bilinear, &cfs, scale );
|
||||||
}
|
}
|
||||||
|
|
||||||
tpp->getDimensions(lastW, lastH, lastScale);
|
tpp->getDimensions(lastW, lastH, lastScale);
|
||||||
@ -640,7 +642,7 @@ rtengine::IImage8* Thumbnail::upgradeThumbImage (const rtengine::procparams::Pro
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rtengine::IImage8* image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, cfs.getCamera(), cfs.focalLen, cfs.focalLen35mm, cfs.focusDist, cfs.shutter, cfs.fnumber, cfs.iso, cfs.expcomp, scale );
|
// rtengine::IImage8* image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, cfs.getCamera(), cfs.focalLen, cfs.focalLen35mm, cfs.focusDist, cfs.shutter, cfs.fnumber, cfs.iso, cfs.expcomp, scale );
|
||||||
rtengine::IImage8* image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, &cfs, scale );
|
rtengine::IImage8* image = tpp->processImage (pparams, static_cast<rtengine::eSensorType>(cfs.sensortype), h, rtengine::TI_Bilinear, &cfs, scale );
|
||||||
tpp->getDimensions(lastW, lastH, lastScale);
|
tpp->getDimensions(lastW, lastH, lastScale);
|
||||||
|
|
||||||
delete tpp;
|
delete tpp;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user