Add multi-frame handling.
- Exif of all frames are displayed in the Editor's Exif tab (without separator) - isHDR and isPixelShift is added to the data files stored in cache - In the Editor panel, the QuickInfo frame display the HDR and PixelShift information, as well as the number of frame and bit-depth for HDR image - the number of frame is provided by dcraw. If not set, it is provided by the Exif's main IFD count - the PixelShift information (for Pentax as of now) is provided by looking at the Exif informations - the HDR information is provided by the Exif information of the first frame for Pentax raw files, or by the bitspersample, sampleformat and compression tags for other files TODO: add icons to the thumbnails to tag HDR and PixelShift files.
This commit is contained in:
parent
b183a0b3c7
commit
f23be9345c
@ -1155,8 +1155,16 @@ PROGRESSBAR_SAVEPNG;Enregistrement du fichier PNG...
|
||||
PROGRESSBAR_SAVETIFF;Enregistrement du fichier TIFF...
|
||||
PROGRESSBAR_SNAPSHOT_ADDED;Signet ajouté
|
||||
PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil modifié dans le navigateur
|
||||
QINFO_HDR;HDR / %1 image(s)
|
||||
QINFO_ISO;ISO
|
||||
QINFO_NOEXIF;Données EXIF non disponibles.
|
||||
QINFO_PIXELSHIFT;PixelShift / %1 images
|
||||
SAMPLEFORMAT_0;Format de donnée inconnu
|
||||
SAMPLEFORMAT_1;8 bits non signé
|
||||
SAMPLEFORMAT_2;16 bits non signé
|
||||
SAMPLEFORMAT_4;LogLuv 24 bits
|
||||
SAMPLEFORMAT_8;LogLuv 32 bits
|
||||
SAMPLEFORMAT_16;32 bits à virgule flottante
|
||||
SAVEDLG_AUTOSUFFIX;Ajouter automatiquement un suffixe si le fichier existe déjà
|
||||
SAVEDLG_FILEFORMAT;Format de fichier
|
||||
SAVEDLG_FORCEFORMATOPTS;Forcer les options d'enregistrement
|
||||
|
@ -1157,8 +1157,16 @@ PROGRESSBAR_SAVEPNG;Saving PNG file...
|
||||
PROGRESSBAR_SAVETIFF;Saving TIFF file...
|
||||
PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added
|
||||
PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser
|
||||
QINFO_HDR;HDR / %1 frame(s)
|
||||
QINFO_ISO;ISO
|
||||
QINFO_NOEXIF;Exif data not available.
|
||||
QINFO_PIXELSHIFT;PixelShift / %1 frame(s)
|
||||
SAMPLEFORMAT_0;Unknown data format
|
||||
SAMPLEFORMAT_1;Unsigned 8 bits
|
||||
SAMPLEFORMAT_2;Unsigned 16 bits
|
||||
SAMPLEFORMAT_4;LogLuv 24 bits
|
||||
SAMPLEFORMAT_8;LogLuv 32 bits
|
||||
SAMPLEFORMAT_16;32 bits floating point
|
||||
SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists
|
||||
SAVEDLG_FILEFORMAT;File format
|
||||
SAVEDLG_FORCEFORMATOPTS;Force saving options
|
||||
|
@ -696,7 +696,8 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) :
|
||||
return;
|
||||
}
|
||||
|
||||
std::unique_ptr<TagDirectory> tagDir(ExifManager::parseTIFF(file, false));
|
||||
ExifManager exifManager(file, nullptr, true);
|
||||
std::unique_ptr<TagDirectory> tagDir(exifManager.parseTIFF(false));
|
||||
|
||||
Tag* tag = tagDir->getTag(toUnderlying(TagKey::CALIBRATION_ILLUMINANT_1));
|
||||
light_source_1 =
|
||||
|
@ -382,11 +382,8 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool)
|
||||
return &(iter->second);
|
||||
}
|
||||
|
||||
RawMetaDataLocation rml;
|
||||
rml.exifBase = ri.get_exifBase();
|
||||
rml.ciffBase = ri.get_ciffBase();
|
||||
rml.ciffLength = ri.get_ciffLen();
|
||||
ImageData idata(filename, &rml);
|
||||
RawMetaDataLocation rml(ri.get_exifBase(), ri.get_ciffBase(), ri.get_ciffLen());
|
||||
FramesData idata(filename, &rml, true);
|
||||
/* Files are added in the map, divided by same maker/model,ISO and shutter*/
|
||||
std::string key( dfInfo::key(((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed()) );
|
||||
iter = dfList.find( key );
|
||||
|
@ -72,7 +72,7 @@ bool DynamicProfileRule::operator< (const DynamicProfileRule &other) const
|
||||
}
|
||||
|
||||
|
||||
bool DynamicProfileRule::matches (const rtengine::ImageMetaData *im) const
|
||||
bool DynamicProfileRule::matches (const rtengine::FramesMetaData *im) const
|
||||
{
|
||||
return (iso (im->getISOSpeed())
|
||||
&& fnumber (im->getFNumber())
|
||||
|
@ -48,7 +48,7 @@ public:
|
||||
};
|
||||
|
||||
DynamicProfileRule();
|
||||
bool matches (const rtengine::ImageMetaData *im) const;
|
||||
bool matches (const rtengine::FramesMetaData *im) const;
|
||||
bool operator< (const DynamicProfileRule &other) const;
|
||||
|
||||
int serial_number;
|
||||
|
@ -338,11 +338,8 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool)
|
||||
return &(iter->second);
|
||||
}
|
||||
|
||||
RawMetaDataLocation rml;
|
||||
rml.exifBase = ri.get_exifBase();
|
||||
rml.ciffBase = ri.get_ciffBase();
|
||||
rml.ciffLength = ri.get_ciffLen();
|
||||
ImageData idata(filename, &rml);
|
||||
RawMetaDataLocation rml(ri.get_exifBase(), ri.get_ciffBase(), ri.get_ciffLen());
|
||||
FramesData idata(filename, &rml, true);
|
||||
/* Files are added in the map, divided by same maker/model,lens and aperture*/
|
||||
std::string key( ffInfo::key(idata.getMake(), idata.getModel(), idata.getLens(), idata.getFocalLen(), idata.getFNumber()) );
|
||||
iter = ffList.find( key );
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
#include <strings.h>
|
||||
#include <glib/gstdio.h>
|
||||
#include <tiff.h>
|
||||
|
||||
#include "imagedata.h"
|
||||
#include "iptcpairs.h"
|
||||
@ -40,24 +41,25 @@ Glib::ustring to_utf8 (const std::string& str)
|
||||
|
||||
}
|
||||
|
||||
ImageMetaData* ImageMetaData::fromFile (const Glib::ustring& fname, RawMetaDataLocation* rml)
|
||||
FramesMetaData* FramesMetaData::fromFile (const Glib::ustring& fname, RawMetaDataLocation* rml, bool firstFrameOnly)
|
||||
{
|
||||
|
||||
return new ImageData (fname, rml);
|
||||
return new FramesData (fname, rml, firstFrameOnly);
|
||||
}
|
||||
|
||||
ImageData::ImageData (Glib::ustring fname, RawMetaDataLocation* ri) : iso_speed(0), aperture(0.), shutter(0.)
|
||||
FrameData::FrameData ()
|
||||
: root(nullptr), iptc(nullptr), time(), timeStamp(), iso_speed(0), aperture(0.), focal_len(0.), focal_len35mm(0.), focus_dist(0.f),
|
||||
shutter(0.), expcomp(0.), make("Unknown"), model("Unknown"), orientation("Unknown"), lens("Unknown"),
|
||||
sampleFormat(IIOSF_UNKNOWN), isPixelShift(false), isHDR(false)
|
||||
{
|
||||
memset (&time, 0, sizeof(time));
|
||||
root = nullptr;
|
||||
iptc = nullptr;
|
||||
}
|
||||
|
||||
if (ri && (ri->exifBase >= 0 || ri->ciffBase >= 0)) {
|
||||
FILE* f = g_fopen (fname.c_str (), "rb");
|
||||
|
||||
if (f) {
|
||||
if (ri->exifBase >= 0) {
|
||||
root = rtexif::ExifManager::parse (f, ri->exifBase);
|
||||
RawFrameData::RawFrameData (rtexif::ExifManager &exifManager)
|
||||
{
|
||||
bool rootCreated = false;
|
||||
if (exifManager.f && exifManager.rml) {
|
||||
if (exifManager.rml->exifBase >= 0) {
|
||||
root = exifManager.parse ();
|
||||
|
||||
if (root) {
|
||||
rtexif::Tag* t = root->getTag (0x83BB);
|
||||
@ -65,56 +67,59 @@ ImageData::ImageData (Glib::ustring fname, RawMetaDataLocation* ri) : iso_speed(
|
||||
if (t) {
|
||||
iptc = iptc_data_new_from_data ((unsigned char*)t->getValue (), (unsigned)t->getValueSize ());
|
||||
}
|
||||
}
|
||||
} else if (ri->ciffBase >= 0) {
|
||||
root = rtexif::ExifManager::parseCIFF (f, ri->ciffBase, ri->ciffLength);
|
||||
}
|
||||
|
||||
fclose (f);
|
||||
extractInfo ();
|
||||
rootCreated = true;
|
||||
}
|
||||
} else if (hasJpegExtension(fname)) {
|
||||
FILE* f = g_fopen (fname.c_str (), "rb");
|
||||
|
||||
if (f) {
|
||||
root = rtexif::ExifManager::parseJPEG (f);
|
||||
} else if (exifManager.rml->ciffBase >= 0) {
|
||||
root = exifManager.parseCIFF ();
|
||||
extractInfo ();
|
||||
fclose (f);
|
||||
FILE* ff = g_fopen (fname.c_str (), "rb");
|
||||
iptc = iptc_data_new_from_jpeg_file (ff);
|
||||
fclose (ff);
|
||||
}
|
||||
} else if (hasTiffExtension(fname)) {
|
||||
FILE* f = g_fopen (fname.c_str (), "rb");
|
||||
|
||||
if (f) {
|
||||
root = rtexif::ExifManager::parseTIFF (f);
|
||||
fclose (f);
|
||||
extractInfo ();
|
||||
|
||||
if (root) {
|
||||
rtexif::Tag* t = root->getTag (0x83BB);
|
||||
|
||||
if (t) {
|
||||
iptc = iptc_data_new_from_data ((unsigned char*)t->getValue (), (unsigned)t->getValueSize ());
|
||||
rootCreated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!rootCreated) {
|
||||
root = new rtexif::TagDirectory ();
|
||||
shutter = 0;
|
||||
aperture = 0;
|
||||
iso_speed = 0;
|
||||
lens = "Unknown";
|
||||
make = "Unknown";
|
||||
model = "Unknown";
|
||||
orientation = "Unknown";
|
||||
expcomp = 0;
|
||||
focal_len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void ImageData::extractInfo ()
|
||||
JpegFrameData::JpegFrameData (rtexif::ExifManager &exifManager)
|
||||
{
|
||||
bool rootCreated = false;
|
||||
if (exifManager.f) {
|
||||
root = exifManager.parseJPEG ();
|
||||
if (root) {
|
||||
extractInfo ();
|
||||
rootCreated = true;
|
||||
}
|
||||
rewind (exifManager.f); // Not sure this is necessary
|
||||
iptc = iptc_data_new_from_jpeg_file (exifManager.f);
|
||||
}
|
||||
if (!rootCreated) {
|
||||
root = new rtexif::TagDirectory ();
|
||||
}
|
||||
}
|
||||
|
||||
TiffFrameData::TiffFrameData (rtexif::ExifManager &exifManager)
|
||||
{
|
||||
bool rootCreated = false;
|
||||
if (exifManager.f) {
|
||||
root = exifManager.parseTIFF ();
|
||||
extractInfo ();
|
||||
|
||||
if (root) {
|
||||
rtexif::Tag* t = root->getTag (0x83BB);
|
||||
|
||||
if (t) {
|
||||
iptc = iptc_data_new_from_data ((unsigned char*)t->getValue (), (unsigned)t->getValueSize ());
|
||||
}
|
||||
rootCreated = true;
|
||||
}
|
||||
}
|
||||
if (!rootCreated) {
|
||||
root = new rtexif::TagDirectory ();
|
||||
}
|
||||
}
|
||||
|
||||
void FrameData::extractInfo ()
|
||||
{
|
||||
|
||||
if (!root) {
|
||||
@ -206,8 +211,13 @@ void ImageData::extractInfo ()
|
||||
orientation = root->getTag ("Orientation")->valueToString ();
|
||||
}
|
||||
|
||||
rtexif::TagDirectory* exif = nullptr;
|
||||
rtexif::Tag* mnoteTag = root->findTag("MakerNote");
|
||||
rtexif::TagDirectory* mnote = nullptr;
|
||||
if (mnoteTag) {
|
||||
mnote = mnoteTag->getDirectory();
|
||||
}
|
||||
|
||||
rtexif::TagDirectory* exif = nullptr;
|
||||
if (root->getTag ("Exif")) {
|
||||
exif = root->getTag ("Exif")->getDirectory ();
|
||||
}
|
||||
@ -313,12 +323,10 @@ void ImageData::extractInfo ()
|
||||
}
|
||||
|
||||
if (lens == "Unknown") {
|
||||
rtexif::Tag* mnoteTag = root->findTag("MakerNote");
|
||||
|
||||
if (mnoteTag) {
|
||||
rtexif::TagDirectory* mnote = mnoteTag->getDirectory();
|
||||
if (mnote) {
|
||||
|
||||
if (mnote && !make.compare (0, 5, "NIKON")) {
|
||||
if (!make.compare (0, 5, "NIKON")) {
|
||||
// ISO at max value supported, check manufacturer specific
|
||||
if (iso_speed == 65535 || iso_speed == 0) {
|
||||
rtexif::Tag* isoTag = mnote->getTagP("ISOInfo/ISO");
|
||||
@ -406,7 +414,7 @@ void ImageData::extractInfo ()
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (mnote && !make.compare (0, 5, "Canon")) {
|
||||
} else if (!make.compare (0, 5, "Canon")) {
|
||||
// ISO at max value supported, check manufacturer specific
|
||||
if (iso_speed == 65535 || iso_speed == 0) {
|
||||
rtexif::Tag* baseIsoTag = mnote->getTagP("CanonShotInfo/BaseISO");
|
||||
@ -440,7 +448,7 @@ void ImageData::extractInfo ()
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (mnote && (!make.compare (0, 6, "PENTAX") || (!make.compare (0, 5, "RICOH") && !model.compare (0, 6, "PENTAX")))) {
|
||||
} else if (!make.compare (0, 6, "PENTAX") || (!make.compare (0, 5, "RICOH") && !model.compare (0, 6, "PENTAX"))) {
|
||||
// ISO at max value supported, check manufacturer specific
|
||||
if (iso_speed == 65535 || iso_speed == 0) {
|
||||
rtexif::Tag* baseIsoTag = mnote->getTag("ISO");
|
||||
@ -475,7 +483,7 @@ void ImageData::extractInfo ()
|
||||
if (mnote->getTag ("LensID")) {
|
||||
lens = mnote->getTag ("LensID")->valueToString ();
|
||||
}
|
||||
} else if (mnote && !make.compare (0, 7, "OLYMPUS")) {
|
||||
} else if (!make.compare (0, 7, "OLYMPUS")) {
|
||||
if (mnote->getTag ("Equipment")) {
|
||||
rtexif::TagDirectory* eq = mnote->getTag ("Equipment")->getDirectory ();
|
||||
|
||||
@ -504,9 +512,111 @@ void ImageData::extractInfo ()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----------------------- Special file type detection (HDR, PixelShift) ------------------------
|
||||
|
||||
|
||||
uint16 bitspersample = 0, samplesperpixel = 0, sampleformat = 0, photometric = 0, compression = 0;
|
||||
rtexif::Tag* bps = root->findTag("BitsPerSample");
|
||||
rtexif::Tag* spp = root->findTag("SamplesPerPixel");
|
||||
rtexif::Tag* sf = root->findTag("SampleFormat");
|
||||
rtexif::Tag* pi = root->findTag("PhotometricInterpretation");
|
||||
rtexif::Tag* c = root->findTag("Compression");
|
||||
|
||||
if (mnote && (!make.compare (0, 6, "PENTAX") || (!make.compare (0, 5, "RICOH") && !model.compare (0, 6, "PENTAX")))) {
|
||||
rtexif::Tag* hdr = mnote->findTag("HDR");
|
||||
if (hdr) {
|
||||
if (hdr->toInt() > 0 && hdr->toInt(2) > 0) {
|
||||
isHDR = true;
|
||||
}
|
||||
} else {
|
||||
rtexif::Tag* dm = mnote->findTag("DriveMode");
|
||||
if (dm) {
|
||||
char buffer[60];
|
||||
dm->toString(buffer, 3);
|
||||
buffer[3] = 0;
|
||||
if (!strcmp(buffer, "HDR")) {
|
||||
isHDR = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!isHDR) {
|
||||
rtexif::Tag* q = mnote->findTag("Quality");
|
||||
if (q && q->toInt() == 7) {
|
||||
isPixelShift = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sampleFormat = IIOSF_UNKNOWN;
|
||||
|
||||
if (!sf)
|
||||
/*
|
||||
* WARNING: This is a dirty hack!
|
||||
* We assume that files which doesn't contain the TIFFTAG_SAMPLEFORMAT tag
|
||||
* (which is the case with uncompressed TIFFs produced by RT!) are RGB files,
|
||||
* but that may be not true. --- Hombre
|
||||
*/
|
||||
{
|
||||
sampleformat = SAMPLEFORMAT_UINT;
|
||||
} else {
|
||||
sampleformat = sf->toInt();
|
||||
}
|
||||
|
||||
if ((!bps & !spp) || !pi) {
|
||||
return;
|
||||
}
|
||||
|
||||
samplesperpixel = spp->toInt();
|
||||
bitspersample = bps->toInt();
|
||||
|
||||
photometric = pi->toInt();
|
||||
if (photometric == PHOTOMETRIC_LOGLUV) {
|
||||
if (!c) {
|
||||
compression = COMPRESSION_NONE;
|
||||
} else {
|
||||
compression = c->toInt();
|
||||
}
|
||||
}
|
||||
|
||||
if (photometric == PHOTOMETRIC_RGB || photometric == PHOTOMETRIC_MINISBLACK) {
|
||||
if ((samplesperpixel == 1 || samplesperpixel == 3 || samplesperpixel == 4) && sampleformat == SAMPLEFORMAT_UINT) {
|
||||
if (bitspersample == 8) {
|
||||
sampleFormat = IIOSF_UNSIGNED_CHAR;
|
||||
}
|
||||
|
||||
if (bitspersample == 16) {
|
||||
sampleFormat = IIOSF_UNSIGNED_SHORT;
|
||||
}
|
||||
} else if (samplesperpixel == 3 && sampleformat == SAMPLEFORMAT_IEEEFP) {
|
||||
/*
|
||||
* Not yet supported
|
||||
*
|
||||
if (bitspersample==16) {
|
||||
sampleFormat = IIOSF_HALF;
|
||||
}*/
|
||||
if ((samplesperpixel == 3 || samplesperpixel == 4) && bitspersample == 32) {
|
||||
sampleFormat = IIOSF_FLOAT;
|
||||
isHDR = true;
|
||||
}
|
||||
}
|
||||
} else if (photometric == PHOTOMETRIC_CFA) {
|
||||
// Assuming Bayer or X-Trans raw file deliver 10, 12 14 or 16 bits uint, which is the case as of now
|
||||
sampleFormat = IIOSF_UNSIGNED_SHORT;
|
||||
} else if (samplesperpixel == 3 && photometric == PHOTOMETRIC_LOGLUV) {
|
||||
if (compression == COMPRESSION_SGILOG24) {
|
||||
sampleFormat = IIOSF_LOGLUV24;
|
||||
isHDR = true;
|
||||
} else if (compression == COMPRESSION_SGILOG) {
|
||||
sampleFormat = IIOSF_LOGLUV32;
|
||||
isHDR = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ImageData::~ImageData ()
|
||||
FrameData::~FrameData ()
|
||||
{
|
||||
|
||||
delete root;
|
||||
@ -516,7 +626,7 @@ ImageData::~ImageData ()
|
||||
}
|
||||
}
|
||||
|
||||
const procparams::IPTCPairs ImageData::getIPTCData () const
|
||||
const procparams::IPTCPairs FrameData::getIPTCData () const
|
||||
{
|
||||
|
||||
procparams::IPTCPairs iptcc;
|
||||
@ -565,7 +675,7 @@ const procparams::IPTCPairs ImageData::getIPTCData () const
|
||||
//------inherited functions--------------//
|
||||
|
||||
|
||||
std::string ImageMetaData::apertureToString (double aperture)
|
||||
std::string FramesMetaData::apertureToString (double aperture)
|
||||
{
|
||||
|
||||
char buffer[256];
|
||||
@ -573,7 +683,7 @@ std::string ImageMetaData::apertureToString (double aperture)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
std::string ImageMetaData::shutterToString (double shutter)
|
||||
std::string FramesMetaData::shutterToString (double shutter)
|
||||
{
|
||||
|
||||
char buffer[256];
|
||||
@ -587,7 +697,7 @@ std::string ImageMetaData::shutterToString (double shutter)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
std::string ImageMetaData::expcompToString (double expcomp, bool maskZeroexpcomp)
|
||||
std::string FramesMetaData::expcompToString (double expcomp, bool maskZeroexpcomp)
|
||||
{
|
||||
|
||||
char buffer[256];
|
||||
@ -605,7 +715,7 @@ std::string ImageMetaData::expcompToString (double expcomp, bool maskZeroexpcomp
|
||||
}
|
||||
}
|
||||
|
||||
double ImageMetaData::shutterFromString (std::string s)
|
||||
double FramesMetaData::shutterFromString (std::string s)
|
||||
{
|
||||
|
||||
size_t i = s.find_first_of ('/');
|
||||
@ -617,7 +727,7 @@ double ImageMetaData::shutterFromString (std::string s)
|
||||
}
|
||||
}
|
||||
|
||||
double ImageMetaData::apertureFromString (std::string s)
|
||||
double FramesMetaData::apertureFromString (std::string s)
|
||||
{
|
||||
|
||||
return atof (s.c_str());
|
||||
@ -685,3 +795,60 @@ failure:
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
FramesData::FramesData (Glib::ustring fname, RawMetaDataLocation* rml, bool firstFrameOnly, bool loadAll) : dcrawFrameCount (0)
|
||||
{
|
||||
if (rml && (rml->exifBase >= 0 || rml->ciffBase >= 0)) {
|
||||
FILE* f = g_fopen (fname.c_str (), "rb");
|
||||
|
||||
if (f) {
|
||||
rtexif::ExifManager exifManager (f, rml, firstFrameOnly);
|
||||
|
||||
if (rml->exifBase >= 0) {
|
||||
FrameData *idata = new RawFrameData (exifManager);
|
||||
frames.push_back(idata);
|
||||
if (rml && !firstFrameOnly) {
|
||||
while (exifManager.getNextIFDOffset ()) {
|
||||
int nextIFD = exifManager.getNextIFDOffset ();
|
||||
exifManager.setIFDOffset (nextIFD);
|
||||
idata = new RawFrameData (exifManager);
|
||||
frames.push_back(idata);
|
||||
}
|
||||
}
|
||||
}
|
||||
fclose (f);
|
||||
}
|
||||
} else if (hasJpegExtension(fname)) {
|
||||
FILE* f = g_fopen (fname.c_str (), "rb");
|
||||
|
||||
if (f) {
|
||||
rtexif::ExifManager exifManager (f, rml, true);
|
||||
FrameData *idata = new JpegFrameData (exifManager);
|
||||
frames.push_back(idata);
|
||||
fclose (f);
|
||||
}
|
||||
} else if (hasTiffExtension(fname)) {
|
||||
FILE* f = g_fopen (fname.c_str (), "rb");
|
||||
|
||||
if (f) {
|
||||
rtexif::ExifManager exifManager (f, rml, firstFrameOnly);
|
||||
FrameData *idata = new TiffFrameData (exifManager);
|
||||
frames.push_back(idata);
|
||||
if (rml && !firstFrameOnly) {
|
||||
while (exifManager.getNextIFDOffset ()) {
|
||||
exifManager.setIFDOffset (exifManager.getNextIFDOffset ());
|
||||
idata = new TiffFrameData (exifManager);
|
||||
frames.push_back(idata);
|
||||
}
|
||||
}
|
||||
fclose (f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FramesData::~FramesData ()
|
||||
{
|
||||
for (auto currFrame : frames) {
|
||||
delete currFrame;
|
||||
}
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
namespace rtengine
|
||||
{
|
||||
|
||||
class ImageData : public ImageMetaData
|
||||
class FrameData
|
||||
{
|
||||
|
||||
protected:
|
||||
@ -49,13 +49,34 @@ protected:
|
||||
std::string make, model, serial;
|
||||
std::string orientation;
|
||||
std::string lens;
|
||||
IIOSampleFormat sampleFormat;
|
||||
|
||||
// each frame has the knowledge of "being an"
|
||||
// or "being part of an" HDR or PS image
|
||||
bool isPixelShift;
|
||||
int isHDR; // Number of frame
|
||||
|
||||
void extractInfo ();
|
||||
|
||||
public:
|
||||
|
||||
ImageData (Glib::ustring fname, RawMetaDataLocation* rml = nullptr);
|
||||
virtual ~ImageData ();
|
||||
FrameData ();
|
||||
FrameData (rtexif::ExifManager &exifManager);
|
||||
virtual ~FrameData ();
|
||||
|
||||
bool getPixelShift () const
|
||||
{
|
||||
return isPixelShift;
|
||||
}
|
||||
int getHDR () const
|
||||
{
|
||||
return isHDR;
|
||||
}
|
||||
|
||||
IIOSampleFormat getSampleFormat () const
|
||||
{
|
||||
return sampleFormat;
|
||||
}
|
||||
|
||||
const rtexif::TagDirectory* getExifData () const
|
||||
{
|
||||
@ -128,5 +149,154 @@ public:
|
||||
return orientation;
|
||||
}
|
||||
};
|
||||
|
||||
class RawFrameData : public FrameData
|
||||
{
|
||||
public:
|
||||
RawFrameData (rtexif::ExifManager &exifManager);
|
||||
};
|
||||
|
||||
class JpegFrameData : public FrameData
|
||||
{
|
||||
public:
|
||||
JpegFrameData (rtexif::ExifManager &exifManager);
|
||||
};
|
||||
|
||||
class TiffFrameData : public FrameData
|
||||
{
|
||||
public:
|
||||
TiffFrameData (rtexif::ExifManager &exifManager);
|
||||
};
|
||||
|
||||
class FramesData : public FramesMetaData {
|
||||
private:
|
||||
std::vector<FrameData*> frames;
|
||||
int dcrawFrameCount;
|
||||
|
||||
public:
|
||||
FramesData (Glib::ustring fname, RawMetaDataLocation* rml = nullptr, bool firstFrameOnly = false, bool loadAll = false);
|
||||
~FramesData ();
|
||||
|
||||
void setDCRawFrameCount (int frameCount)
|
||||
{
|
||||
dcrawFrameCount = frameCount;
|
||||
}
|
||||
|
||||
int getFrameCount () const
|
||||
{
|
||||
return dcrawFrameCount ? dcrawFrameCount : frames.size();
|
||||
}
|
||||
FrameData *getFrameData (int frame) const
|
||||
{
|
||||
return frames.at(frame);
|
||||
}
|
||||
|
||||
bool getPixelShift (int frame = 0) const
|
||||
{
|
||||
// So far only Pentax provide multi-frame HDR file.
|
||||
// Only the first frame contains the HDR tag
|
||||
// If more brand have to be supported, this rule may need
|
||||
// to evolve
|
||||
|
||||
//return frames.at(frame)->getPixelShift ();
|
||||
return frames.at(0)->getPixelShift ();
|
||||
}
|
||||
int getHDR (int frame = 0) const
|
||||
{
|
||||
// So far only Pentax provide multi-frame HDR file.
|
||||
// Only the first frame contains the HDR tag
|
||||
// If more brand have to be supported, this rule may need
|
||||
// to evolve
|
||||
|
||||
//return frames.at(frame)->getPixelShift ();
|
||||
if (frames.size()) {
|
||||
return frames.at(frame)->getHDR ();
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
IIOSampleFormat getSampleFormat (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getSampleFormat ();
|
||||
}
|
||||
|
||||
const rtexif::TagDirectory* getExifData (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getExifData ();
|
||||
}
|
||||
const procparams::IPTCPairs getIPTCData (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getIPTCData ();
|
||||
}
|
||||
|
||||
bool hasExif (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->hasExif ();
|
||||
}
|
||||
bool hasIPTC (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->hasIPTC ();
|
||||
}
|
||||
|
||||
struct tm getDateTime (int frame = 0) const {
|
||||
return frames.at(frame)->getDateTime ();
|
||||
}
|
||||
time_t getDateTimeAsTS(int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getDateTimeAsTS ();
|
||||
}
|
||||
int getISOSpeed (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getISOSpeed ();
|
||||
}
|
||||
double getFNumber (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getFNumber ();
|
||||
}
|
||||
double getFocalLen (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getFocalLen ();
|
||||
}
|
||||
double getFocalLen35mm (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getFocalLen35mm ();
|
||||
}
|
||||
float getFocusDist (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getFocusDist ();
|
||||
}
|
||||
double getShutterSpeed (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getShutterSpeed ();
|
||||
}
|
||||
double getExpComp (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getExpComp ();
|
||||
}
|
||||
std::string getMake (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getMake ();
|
||||
}
|
||||
std::string getModel (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getModel ();
|
||||
}
|
||||
std::string getLens (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getLens ();
|
||||
}
|
||||
std::string getSerialNumber (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getSerialNumber ();
|
||||
}
|
||||
std::string getOrientation (int frame = 0) const
|
||||
{
|
||||
return frames.at(frame)->getOrientation ();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
#endif
|
||||
|
54
rtengine/imageformat.h
Normal file
54
rtengine/imageformat.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* This file is part of RawTherapee.
|
||||
*
|
||||
* Copyright (c) 20017 Jean-Christophe Frisch <natureh.510@gmail.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _IMAGEFORMAT_
|
||||
#define _IMAGEFORMAT_
|
||||
|
||||
namespace rtengine
|
||||
{
|
||||
|
||||
//NB: Update the associated strings in languages files when updating the following enum
|
||||
// Look for "SAMPLEFORMAT_"
|
||||
typedef enum IIO_Sample_Format {
|
||||
IIOSF_UNKNOWN = 0, // Unknown or Unsupported file type; Has to remain 0
|
||||
//IIOSF_SIGNED_INT , // Not yet supported
|
||||
IIOSF_UNSIGNED_CHAR = 1 << 0,
|
||||
IIOSF_UNSIGNED_SHORT = 1 << 1,
|
||||
//IIOSF_HALF , // OpenEXR & NVidia's Half Float, not yet supported
|
||||
IIOSF_LOGLUV24 = 1 << 2,
|
||||
IIOSF_LOGLUV32 = 1 << 3,
|
||||
IIOSF_FLOAT = 1 << 4
|
||||
} IIOSampleFormat;
|
||||
|
||||
typedef enum IIO_Sample_Arrangement {
|
||||
IIOSA_UNKNOWN, // Unknown or Unsupported file type
|
||||
IIOSA_CHUNKY,
|
||||
IIOSA_PLANAR
|
||||
} IIOSampleArrangement;
|
||||
|
||||
typedef enum SensorType {
|
||||
ST_NONE, // use this value if the image is already demosaiced (i.e. not a raw file)
|
||||
ST_BAYER,
|
||||
ST_FUJI_XTRANS,
|
||||
ST_FOVEON,
|
||||
//ST_FUJI_EXR
|
||||
} eSensorType;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -29,6 +29,7 @@
|
||||
#define IMIO_CANNOTWRITEFILE 7
|
||||
|
||||
#include "rtengine.h"
|
||||
#include "imageformat.h"
|
||||
#include <glibmm.h>
|
||||
#include "procparams.h"
|
||||
#include <libiptcdata/iptc-data.h>
|
||||
@ -43,31 +44,6 @@ namespace rtengine
|
||||
class ProgressListener;
|
||||
class Imagefloat;
|
||||
|
||||
typedef enum IIO_Sample_Format {
|
||||
IIOSF_UNKNOWN = 0, // Unknown or Unsupported file type; Has to remain 0
|
||||
//IIOSF_SIGNED_INT , // Not yet supported
|
||||
IIOSF_UNSIGNED_CHAR = 1 << 0,
|
||||
IIOSF_UNSIGNED_SHORT = 1 << 1,
|
||||
//IIOSF_HALF , // OpenEXR & NVidia's Half Float, not yet supported
|
||||
IIOSF_LOGLUV24 = 1 << 2,
|
||||
IIOSF_LOGLUV32 = 1 << 3,
|
||||
IIOSF_FLOAT = 1 << 4
|
||||
} IIOSampleFormat;
|
||||
|
||||
typedef enum IIO_Sample_Arrangement {
|
||||
IIOSA_UNKNOWN, // Unknown or Unsupported file type
|
||||
IIOSA_CHUNKY,
|
||||
IIOSA_PLANAR
|
||||
} IIOSampleArrangement;
|
||||
|
||||
typedef enum SensorType {
|
||||
ST_NONE, // use this value if the image is already demosaiced (i.e. not a raw file)
|
||||
ST_BAYER,
|
||||
ST_FUJI_XTRANS,
|
||||
ST_FOVEON,
|
||||
//ST_FUJI_EXR
|
||||
} eSensorType;
|
||||
|
||||
class ImageIO : virtual public ImageDatas
|
||||
{
|
||||
|
||||
|
@ -57,7 +57,7 @@ protected:
|
||||
double redAWBMul, greenAWBMul, blueAWBMul; // local copy of the multipliers, to avoid recomputing the values
|
||||
cmsHPROFILE embProfile;
|
||||
Glib::ustring fileName;
|
||||
ImageData* idata;
|
||||
FramesData* idata;
|
||||
ImageMatrices imatrices;
|
||||
double dirpyrdenoiseExpComp;
|
||||
|
||||
@ -76,12 +76,12 @@ public:
|
||||
virtual void flushRGB () {};
|
||||
virtual void HLRecovery_Global (ToneCurveParams hrp) {};
|
||||
virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {};
|
||||
virtual void MSR(LabImage* lab, LUTf & mapcurve, bool &mapcontlutili, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {};
|
||||
virtual void MSR (LabImage* lab, LUTf & mapcurve, bool &mapcontlutili, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {};
|
||||
|
||||
virtual bool IsrgbSourceModified() const = 0; // tracks whether cached rgb output of demosaic has been modified
|
||||
virtual bool IsrgbSourceModified () const = 0; // tracks whether cached rgb output of demosaic has been modified
|
||||
|
||||
virtual void setCurrentFrame(unsigned int frameNum) = 0;
|
||||
virtual int getFrameCount() = 0;
|
||||
virtual void setCurrentFrame (unsigned int frameNum) = 0;
|
||||
virtual int getFrameCount () = 0;
|
||||
|
||||
|
||||
// use right after demosaicing image, add coarse transformation and put the result in the provided Imagefloat*
|
||||
@ -107,10 +107,10 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual ImageData* getImageData () = 0;
|
||||
virtual FrameData* getImageData (int frameNum) = 0;
|
||||
virtual ImageMatrices* getImageMatrices () = 0;
|
||||
virtual bool isRAW() const = 0;
|
||||
virtual DCPProfile* getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as)
|
||||
virtual bool isRAW () const = 0;
|
||||
virtual DCPProfile* getDCP (const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as)
|
||||
{
|
||||
return nullptr;
|
||||
};
|
||||
@ -150,7 +150,7 @@ public:
|
||||
{
|
||||
return embProfile;
|
||||
}
|
||||
virtual const ImageMetaData* getMetaData ()
|
||||
virtual const FramesMetaData* getMetaData ()
|
||||
{
|
||||
return idata;
|
||||
}
|
||||
|
@ -498,7 +498,7 @@ void ProfileStore::dumpFolderList()
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
PartialProfile *ProfileStore::loadDynamicProfile (const ImageMetaData *im)
|
||||
PartialProfile *ProfileStore::loadDynamicProfile (const FramesMetaData *im)
|
||||
{
|
||||
if (storeState == STORESTATE_NOTINITIALIZED) {
|
||||
parseProfilesOnce();
|
||||
|
@ -195,7 +195,7 @@ public:
|
||||
void addListener (ProfileStoreListener *listener);
|
||||
void removeListener (ProfileStoreListener *listener);
|
||||
|
||||
rtengine::procparams::PartialProfile* loadDynamicProfile (const rtengine::ImageMetaData *im);
|
||||
rtengine::procparams::PartialProfile* loadDynamicProfile (const rtengine::FramesMetaData *im);
|
||||
|
||||
void dumpFolderList();
|
||||
};
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include <ctime>
|
||||
|
||||
#include "dcraw.h"
|
||||
#include "imageio.h"
|
||||
#include "imageformat.h"
|
||||
#include "noncopyable.h"
|
||||
|
||||
namespace rtengine
|
||||
|
@ -913,7 +913,7 @@ DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &
|
||||
{
|
||||
DCPProfile *dcpProf = nullptr;
|
||||
cmsHPROFILE dummy;
|
||||
findInputProfile(cmp.input, nullptr, (static_cast<const ImageData*>(getMetaData()))->getCamera(), &dcpProf, dummy);
|
||||
findInputProfile(cmp.input, nullptr, (static_cast<const FramesData*>(getMetaData()))->getCamera(), &dcpProf, dummy);
|
||||
|
||||
if (dcpProf == nullptr) {
|
||||
if (settings->verbose) {
|
||||
@ -929,7 +929,7 @@ DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &
|
||||
void RawImageSource::convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb)
|
||||
{
|
||||
double pre_mul[3] = { ri->get_pre_mul(0), ri->get_pre_mul(1), ri->get_pre_mul(2) };
|
||||
colorSpaceConversion (image, cmp, wb, pre_mul, embProfile, camProfile, imatrices.xyz_cam, (static_cast<const ImageData*>(getMetaData()))->getCamera());
|
||||
colorSpaceConversion (image, cmp, wb, pre_mul, embProfile, camProfile, imatrices.xyz_cam, (static_cast<const FramesData*>(getMetaData()))->getCamera());
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
@ -1703,7 +1703,8 @@ int RawImageSource::load (const Glib::ustring &fname, int imageNum, bool batch)
|
||||
rml.exifBase = ri->get_exifBase();
|
||||
rml.ciffBase = ri->get_ciffBase();
|
||||
rml.ciffLength = ri->get_ciffLen();
|
||||
idata = new ImageData (fname, &rml);
|
||||
idata = new FramesData (fname, &rml);
|
||||
idata->setDCRawFrameCount (numFrames);
|
||||
|
||||
green(W, H);
|
||||
red(W, H);
|
||||
|
@ -166,9 +166,9 @@ public:
|
||||
return ri->get_rotateDegree();
|
||||
}
|
||||
|
||||
ImageData* getImageData ()
|
||||
FrameData* getImageData (int frameNum)
|
||||
{
|
||||
return idata;
|
||||
return idata->getFrameData (frameNum);
|
||||
}
|
||||
ImageMatrices* getImageMatrices ()
|
||||
{
|
||||
|
@ -22,11 +22,19 @@
|
||||
namespace rtengine
|
||||
{
|
||||
|
||||
struct RawMetaDataLocation {
|
||||
class RawMetaDataLocation {
|
||||
|
||||
public:
|
||||
int exifBase;
|
||||
int ciffBase;
|
||||
int ciffLength;
|
||||
|
||||
RawMetaDataLocation () : exifBase(-1), ciffBase(-1), ciffLength(-1) {}
|
||||
RawMetaDataLocation (int exifBase) : exifBase(exifBase), ciffBase(-1), ciffLength(-1) {}
|
||||
RawMetaDataLocation (int ciffBase, int ciffLength) : exifBase(-1), ciffBase(ciffBase), ciffLength(ciffLength) {}
|
||||
RawMetaDataLocation (int exifBase, int ciffBase, int ciffLength) : exifBase(exifBase), ciffBase(ciffBase), ciffLength(ciffLength) {}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -19,6 +19,7 @@
|
||||
#ifndef _RTENGINE_
|
||||
#define _RTENGINE_
|
||||
|
||||
#include "imageformat.h"
|
||||
#include "rt_math.h"
|
||||
#include "procparams.h"
|
||||
#include "procevents.h"
|
||||
@ -49,57 +50,68 @@ class IImage16;
|
||||
class IImagefloat;
|
||||
|
||||
/**
|
||||
* This class represents provides functions to obtain exif and IPTC metadata information
|
||||
* from the image file
|
||||
* This class provides functions to obtain exif and IPTC metadata information
|
||||
* from any of the sub-frame of an image file
|
||||
*/
|
||||
class ImageMetaData
|
||||
class FramesMetaData
|
||||
{
|
||||
|
||||
public:
|
||||
/** @return Returns the number of frame contained in the file based on Metadata */
|
||||
virtual int getFrameCount () const = 0;
|
||||
|
||||
/** Checks the availability of exif metadata tags.
|
||||
* @return Returns true if image contains exif metadata tags */
|
||||
virtual bool hasExif () const = 0;
|
||||
virtual bool hasExif (int frame = 0) const = 0;
|
||||
/** Returns the directory of exif metadata tags.
|
||||
* @return The directory of exif metadata tags */
|
||||
virtual const rtexif::TagDirectory* getExifData () const = 0;
|
||||
virtual const rtexif::TagDirectory* getExifData (int frame = 0) const = 0;
|
||||
/** Checks the availability of IPTC tags.
|
||||
* @return Returns true if image contains IPTC tags */
|
||||
virtual bool hasIPTC () const = 0;
|
||||
virtual bool hasIPTC (int frame = 0) const = 0;
|
||||
/** Returns the directory of IPTC tags.
|
||||
* @return The directory of IPTC tags */
|
||||
virtual const procparams::IPTCPairs getIPTCData () const = 0;
|
||||
virtual const procparams::IPTCPairs getIPTCData (int frame = 0) const = 0;
|
||||
/** @return a struct containing the date and time of the image */
|
||||
virtual struct tm getDateTime () const = 0;
|
||||
virtual struct tm getDateTime (int frame = 0) const = 0;
|
||||
/** @return a timestamp containing the date and time of the image */
|
||||
virtual time_t getDateTimeAsTS() const = 0;
|
||||
virtual time_t getDateTimeAsTS(int frame = 0) const = 0;
|
||||
/** @return the ISO of the image */
|
||||
virtual int getISOSpeed () const = 0;
|
||||
virtual int getISOSpeed (int frame = 0) const = 0;
|
||||
/** @return the F number of the image */
|
||||
virtual double getFNumber () const = 0;
|
||||
virtual double getFNumber (int frame = 0) const = 0;
|
||||
/** @return the focal length used at the exposure */
|
||||
virtual double getFocalLen () const = 0;
|
||||
virtual double getFocalLen (int frame = 0) const = 0;
|
||||
/** @return the focal length in 35mm used at the exposure */
|
||||
virtual double getFocalLen35mm () const = 0;
|
||||
virtual double getFocalLen35mm (int frame = 0) const = 0;
|
||||
/** @return the focus distance in meters, 0=unknown, 10000=infinity */
|
||||
virtual float getFocusDist () const = 0;
|
||||
virtual float getFocusDist (int frame = 0) const = 0;
|
||||
/** @return the shutter speed */
|
||||
virtual double getShutterSpeed () const = 0;
|
||||
virtual double getShutterSpeed (int frame = 0) const = 0;
|
||||
/** @return the exposure compensation */
|
||||
virtual double getExpComp () const = 0;
|
||||
virtual double getExpComp (int frame = 0) const = 0;
|
||||
/** @return the maker of the camera */
|
||||
virtual std::string getMake () const = 0;
|
||||
virtual std::string getMake (int frame = 0) const = 0;
|
||||
/** @return the model of the camera */
|
||||
virtual std::string getModel () const = 0;
|
||||
virtual std::string getModel (int frame = 0) const = 0;
|
||||
|
||||
std::string getCamera () const
|
||||
std::string getCamera (int frame = 0) const
|
||||
{
|
||||
return getMake() + " " + getModel();
|
||||
return getMake(frame) + " " + getModel(frame);
|
||||
}
|
||||
|
||||
/** @return the lens on the camera */
|
||||
virtual std::string getLens () const = 0;
|
||||
virtual std::string getLens (int frame = 0) const = 0;
|
||||
/** @return the orientation of the image */
|
||||
virtual std::string getOrientation () const = 0;
|
||||
virtual std::string getOrientation (int frame = 0) const = 0;
|
||||
|
||||
/** @return true if the file is a PixelShift shot (Pentax bodies) */
|
||||
virtual bool getPixelShift (int frame = 0) const = 0;
|
||||
/** @return 0: not ah HDR file ; 1: single shot HDR (e.g. 32 bit float DNG file or Log compressed) ; >1: multi-frame HDR file */
|
||||
virtual int getHDR (int frame = 0) const = 0;
|
||||
/** @return the sample format based on MetaData */
|
||||
virtual IIOSampleFormat getSampleFormat (int frame = 0) const = 0;
|
||||
|
||||
/** Functions to convert between floating point and string representation of shutter and aperture */
|
||||
static std::string apertureToString (double aperture);
|
||||
/** Functions to convert between floating point and string representation of shutter and aperture */
|
||||
@ -111,14 +123,15 @@ public:
|
||||
/** Functions to convert between floating point and string representation of exposure compensation */
|
||||
static std::string expcompToString (double expcomp, bool maskZeroexpcomp);
|
||||
|
||||
virtual ~ImageMetaData () {}
|
||||
virtual ~FramesMetaData () {}
|
||||
|
||||
/** Reads metadata from file.
|
||||
* @param fname is the name of the file
|
||||
* @param rml is a struct containing information about metadata location. Use it only for raw files. In case
|
||||
* of jpgs and tiffs pass a NULL pointer.
|
||||
* @param rml is a struct containing information about metadata location of the first frame.
|
||||
* Use it only for raw files. In caseof jpgs and tiffs pass a NULL pointer.
|
||||
* @param firstFrameOnly must be true to get the MetaData of the first frame only, e.g. for a PixelShift file.
|
||||
* @return The metadata */
|
||||
static ImageMetaData* fromFile (const Glib::ustring& fname, RawMetaDataLocation* rml);
|
||||
static FramesMetaData* fromFile (const Glib::ustring& fname, RawMetaDataLocation* rml, bool firstFrameOnly = false);
|
||||
};
|
||||
|
||||
/** This listener interface is used to indicate the progress of time consuming operations */
|
||||
@ -157,9 +170,9 @@ public:
|
||||
/** Returns the embedded icc profile of the image.
|
||||
* @return The handle of the embedded profile */
|
||||
virtual cmsHPROFILE getEmbeddedProfile () = 0;
|
||||
/** Returns a class providing access to the exif and iptc metadata tags of the image.
|
||||
* @return An instance of the ImageMetaData class */
|
||||
virtual const ImageMetaData* getMetaData () = 0;
|
||||
/** Returns a class providing access to the exif and iptc metadata tags of all frames of the image.
|
||||
* @return An instance of the FramesMetaData class */
|
||||
virtual const FramesMetaData* getMetaData () = 0;
|
||||
/** This is a function used for internal purposes only. */
|
||||
virtual ImageSource* getImageSource () = 0;
|
||||
/** This class has manual reference counting. You have to call this function each time to make a new reference to an instance. */
|
||||
|
@ -158,7 +158,7 @@ int StdImageSource::load (const Glib::ustring &fname, int imageNum, bool batch)
|
||||
|
||||
embProfile = img->getEmbeddedProfile ();
|
||||
|
||||
idata = new ImageData (fname);
|
||||
idata = new FramesData (fname);
|
||||
|
||||
if (idata->hasExif()) {
|
||||
int deg = 0;
|
||||
|
@ -68,9 +68,9 @@ public:
|
||||
void getFullSize (int& w, int& h, int tr = TR_NONE);
|
||||
void getSize (const PreviewProps &pp, int& w, int& h);
|
||||
|
||||
ImageData* getImageData ()
|
||||
FrameData* getImageData (int frameNum)
|
||||
{
|
||||
return idata;
|
||||
return idata->getFrameData (frameNum);
|
||||
}
|
||||
ImageIO* getImageIO ()
|
||||
{
|
||||
|
@ -1228,6 +1228,7 @@ public:
|
||||
choices[2] = "HDR 1";
|
||||
choices[3] = "HDR 2";
|
||||
choices[4] = "HDR 3";
|
||||
choices[5] = "Advanced";
|
||||
|
||||
choices1[0] = "Auto-align Off";
|
||||
choices1[1] = "Auto-align On";
|
||||
|
129
rtexif/rtexif.cc
129
rtexif/rtexif.cc
@ -19,6 +19,7 @@
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <ctime>
|
||||
@ -289,6 +290,8 @@ bool TagDirectory::CPBDump (const Glib::ustring &commFName, const Glib::ustring
|
||||
kf->set_double ("Common Data", "Shutter", cfs->shutter);
|
||||
kf->set_double ("Common Data", "FocalLength", cfs->focalLen);
|
||||
kf->set_integer ("Common Data", "ISO", cfs->iso);
|
||||
kf->set_integer ("Common Data", "IsHDR", cfs->isHDR);
|
||||
kf->set_boolean ("Common Data", "IsPixelShift", cfs->isPixelShift);
|
||||
kf->set_string ("Common Data", "Lens", cfs->lens);
|
||||
kf->set_string ("Common Data", "Make", cfs->camMake);
|
||||
kf->set_string ("Common Data", "Model", cfs->camModel);
|
||||
@ -849,7 +852,11 @@ Tag::Tag (TagDirectory* p, FILE* f, int base)
|
||||
}
|
||||
|
||||
if (tag == 0x002e) { // location of the embedded preview image in raw files of Panasonic cameras
|
||||
TagDirectory* previewdir = ExifManager::parseJPEG (f, ftell (f)); // try to parse the exif data from the preview image
|
||||
TagDirectory* previewdir;
|
||||
{
|
||||
ExifManager exifManager(f, 0, true);
|
||||
previewdir = exifManager.parseJPEG (ftell (f)); // try to parse the exif data from the preview image
|
||||
}
|
||||
|
||||
if (previewdir) {
|
||||
if (previewdir->getTag ("Exif")) {
|
||||
@ -1894,7 +1901,7 @@ const TagAttrib* lookupAttrib (const TagAttrib* dir, const char* field)
|
||||
}
|
||||
|
||||
|
||||
TagDirectory* ExifManager::parseCIFF (FILE* f, int base, int length)
|
||||
TagDirectory* ExifManager::parseCIFF ()
|
||||
{
|
||||
|
||||
TagDirectory* root = new TagDirectory (nullptr, ifdAttribs, INTEL);
|
||||
@ -1904,12 +1911,12 @@ TagDirectory* ExifManager::parseCIFF (FILE* f, int base, int length)
|
||||
mn->initMakerNote (IFD, canonAttribs);
|
||||
root->addTag (exif);
|
||||
exif->getDirectory()->addTag (mn);
|
||||
parseCIFF (f, base, length, root);
|
||||
parseCIFF (rml->ciffLength, root);
|
||||
root->sort ();
|
||||
return root;
|
||||
}
|
||||
|
||||
Tag* ExifManager::saveCIFFMNTag (FILE* f, TagDirectory* root, int len, const char* name)
|
||||
Tag* ExifManager::saveCIFFMNTag (TagDirectory* root, int len, const char* name)
|
||||
{
|
||||
int s = ftell (f);
|
||||
if(s >= 0) {
|
||||
@ -1927,15 +1934,22 @@ Tag* ExifManager::saveCIFFMNTag (FILE* f, TagDirectory* root, int len, const cha
|
||||
}
|
||||
}
|
||||
|
||||
void ExifManager::parseCIFF (FILE* f, int base, int length, TagDirectory* root)
|
||||
void ExifManager::parseCIFF (int length, TagDirectory* root)
|
||||
{
|
||||
|
||||
if (!f) {
|
||||
#ifndef NDEBUG
|
||||
std::cerr << "ERROR : no file opened !" << std::endl;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
char buffer[1024];
|
||||
Tag* t;
|
||||
|
||||
fseek (f, base + length - 4, SEEK_SET);
|
||||
fseek (f, rml->ciffBase + length - 4, SEEK_SET);
|
||||
|
||||
int dirStart = get4 (f, INTEL) + base;
|
||||
int dirStart = get4 (f, INTEL) + rml->ciffBase;
|
||||
fseek (f, dirStart, SEEK_SET);
|
||||
|
||||
int numOfTags = get2 (f, INTEL);
|
||||
@ -1960,10 +1974,12 @@ void ExifManager::parseCIFF (FILE* f, int base, int length, TagDirectory* root)
|
||||
int nextPos = ftell (f) + 4;
|
||||
|
||||
// seek to the location of the value
|
||||
fseek (f, base + get4 (f, INTEL), SEEK_SET);
|
||||
fseek (f, rml->ciffBase + get4 (f, INTEL), SEEK_SET);
|
||||
|
||||
if ((((type >> 8) + 8) | 8) == 0x38) {
|
||||
parseCIFF (f, ftell (f), len, root); // Parse a sub-table
|
||||
rtengine::RawMetaDataLocation rml2(ftell (f), len);
|
||||
ExifManager exifManager(f, &rml2, true);
|
||||
exifManager.parseCIFF (len, root); // Parse a sub-table
|
||||
}
|
||||
|
||||
if (type == 0x0810) {
|
||||
@ -1994,8 +2010,9 @@ void ExifManager::parseCIFF (FILE* f, int base, int length, TagDirectory* root)
|
||||
|
||||
}
|
||||
|
||||
ExifManager exifManager(f, 0, true);
|
||||
if (type == 0x102d) {
|
||||
Tag* t = saveCIFFMNTag (f, root, len, "CanonCameraSettings");
|
||||
Tag* t = exifManager.saveCIFFMNTag (root, len, "CanonCameraSettings");
|
||||
int mm = t->toInt (34, SHORT);
|
||||
Tag* nt = new Tag (exif, lookupAttrib (exifAttribs, "MeteringMode"));
|
||||
|
||||
@ -2074,31 +2091,31 @@ void ExifManager::parseCIFF (FILE* f, int base, int length, TagDirectory* root)
|
||||
}
|
||||
|
||||
if (type == 0x1029) {
|
||||
saveCIFFMNTag (f, root, len, "CanonFocalLength");
|
||||
exifManager.saveCIFFMNTag (root, len, "CanonFocalLength");
|
||||
}
|
||||
|
||||
if (type == 0x1031) {
|
||||
saveCIFFMNTag (f, root, len, "SensorInfo");
|
||||
exifManager.saveCIFFMNTag (root, len, "SensorInfo");
|
||||
}
|
||||
|
||||
if (type == 0x1033) {
|
||||
saveCIFFMNTag (f, root, len, "CustomFunctions");
|
||||
exifManager.saveCIFFMNTag (root, len, "CustomFunctions");
|
||||
}
|
||||
|
||||
if (type == 0x1038) {
|
||||
saveCIFFMNTag (f, root, len, "CanonAFInfo");
|
||||
exifManager.saveCIFFMNTag (root, len, "CanonAFInfo");
|
||||
}
|
||||
|
||||
if (type == 0x1093) {
|
||||
saveCIFFMNTag (f, root, len, "CanonFileInfo");
|
||||
exifManager.saveCIFFMNTag (root, len, "CanonFileInfo");
|
||||
}
|
||||
|
||||
if (type == 0x10a9) {
|
||||
saveCIFFMNTag (f, root, len, "ColorBalance");
|
||||
exifManager.saveCIFFMNTag (root, len, "ColorBalance");
|
||||
}
|
||||
|
||||
if (type == 0x102a) {
|
||||
saveCIFFMNTag (f, root, len, "CanonShotInfo");
|
||||
exifManager.saveCIFFMNTag (root, len, "CanonShotInfo");
|
||||
|
||||
iso = pow (2, (get4 (f, INTEL), get2 (f, INTEL)) / 32.0 - 4) * 50;
|
||||
aperture = (get2 (f, INTEL), (short)get2 (f, INTEL)) / 32.0f;
|
||||
@ -2530,22 +2547,47 @@ parse_leafdata (TagDirectory* root, ByteOrder order)
|
||||
}
|
||||
}
|
||||
|
||||
TagDirectory* ExifManager::parse (FILE* f, int base, bool skipIgnored)
|
||||
TagDirectory* ExifManager::parse (bool skipIgnored)
|
||||
{
|
||||
int ifd = IFDOffset;
|
||||
|
||||
if (!f) {
|
||||
#ifndef NDEBUG
|
||||
std::cerr << "ERROR : no file opened !" << std::endl;
|
||||
#endif
|
||||
return nullptr;
|
||||
}
|
||||
setlocale (LC_NUMERIC, "C"); // to set decimal point in sscanf
|
||||
|
||||
if (order == ByteOrder::UNKNOWN) {
|
||||
// read tiff header
|
||||
fseek (f, base, SEEK_SET);
|
||||
fseek (f, rml->exifBase, SEEK_SET);
|
||||
unsigned short bo;
|
||||
fread (&bo, 1, 2, f);
|
||||
ByteOrder order = (ByteOrder) ((int)bo);
|
||||
order = (ByteOrder) ((int)bo);
|
||||
get2 (f, order);
|
||||
int firstifd = get4 (f, order);
|
||||
if (!ifd) {
|
||||
ifd = get4 (f, order);
|
||||
}
|
||||
}
|
||||
|
||||
return parseIFD (ifd, skipIgnored);
|
||||
}
|
||||
|
||||
TagDirectory* ExifManager::parseIFD (int ifdOffset, bool skipIgnored)
|
||||
{
|
||||
if (!f) {
|
||||
#ifndef NDEBUG
|
||||
std::cerr << "ERROR : no file opened !" << std::endl;
|
||||
#endif
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// seek to IFD0
|
||||
fseek (f, base + firstifd, SEEK_SET);
|
||||
fseek (f, rml->exifBase + ifdOffset, SEEK_SET);
|
||||
|
||||
// first read the IFD directory
|
||||
TagDirectory* root = new TagDirectory (nullptr, f, base, ifdAttribs, order, skipIgnored);
|
||||
TagDirectory* root = new TagDirectory (nullptr, f, rml->exifBase, ifdAttribs, order, skipIgnored);
|
||||
|
||||
// fix ISO issue with nikon and panasonic cameras
|
||||
Tag* make = root->getTag ("Make");
|
||||
@ -2580,8 +2622,8 @@ TagDirectory* ExifManager::parse (FILE* f, int base, bool skipIgnored)
|
||||
if (make && !strncmp ((char*)make->getValue(), "Kodak", 5)) {
|
||||
if (!exif) {
|
||||
// old Kodak cameras may have exif tags in IFD0, reparse and create an exif subdir
|
||||
fseek (f, base + firstifd, SEEK_SET);
|
||||
TagDirectory* exifdir = new TagDirectory (nullptr, f, base, exifAttribs, order, true);
|
||||
fseek (f, rml->exifBase + ifdOffset, SEEK_SET);
|
||||
TagDirectory* exifdir = new TagDirectory (nullptr, f, rml->exifBase, exifAttribs, order, true);
|
||||
|
||||
exif = new Tag (root, root->getAttrib ("Exif"));
|
||||
exif->initSubDir (exifdir);
|
||||
@ -2777,13 +2819,20 @@ TagDirectory* ExifManager::parse (FILE* f, int base, bool skipIgnored)
|
||||
}
|
||||
}
|
||||
|
||||
// root->printAll ();
|
||||
nextIFDOffset = get4 (f, order);
|
||||
|
||||
//root->printAll ();
|
||||
return root;
|
||||
}
|
||||
|
||||
TagDirectory* ExifManager::parseJPEG (FILE* f, int offset)
|
||||
TagDirectory* ExifManager::parseJPEG (int offset)
|
||||
{
|
||||
if (!f) {
|
||||
#ifndef NDEBUG
|
||||
std::cerr << "ERROR : no file opened !" << std::endl;
|
||||
#endif
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if(!fseek (f, offset, SEEK_SET)) {
|
||||
unsigned char c;
|
||||
@ -2805,7 +2854,20 @@ TagDirectory* ExifManager::parseJPEG (FILE* f, int offset)
|
||||
|
||||
if (!memcmp (idbuff + 2, exifid, 6)) { // Exif info found
|
||||
tiffbase = ftell (f);
|
||||
return parse (f, tiffbase);
|
||||
|
||||
// We need a RawMetaDataLocation to put the 'tiffbase' value
|
||||
bool rmlCreated = false;
|
||||
if (!rml) {
|
||||
rml = new rtengine::RawMetaDataLocation (0);
|
||||
rmlCreated = true;
|
||||
}
|
||||
rml->exifBase = tiffbase;
|
||||
TagDirectory* tagDir = parse ();
|
||||
if (rmlCreated) {
|
||||
delete rml;
|
||||
rml = nullptr;
|
||||
}
|
||||
return tagDir;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2815,10 +2877,17 @@ TagDirectory* ExifManager::parseJPEG (FILE* f, int offset)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
TagDirectory* ExifManager::parseTIFF (FILE* f, bool skipIgnored)
|
||||
TagDirectory* ExifManager::parseTIFF (bool skipIgnored)
|
||||
{
|
||||
|
||||
return parse (f, 0, skipIgnored);
|
||||
if (!rml) {
|
||||
rml = new rtengine::RawMetaDataLocation(0);
|
||||
TagDirectory* tagDir = parse (skipIgnored);
|
||||
delete rml;
|
||||
return tagDir;
|
||||
} else {
|
||||
return parse (skipIgnored);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<Tag*> ExifManager::getDefaultTIFFTags (TagDirectory* forthis)
|
||||
|
@ -31,6 +31,7 @@
|
||||
|
||||
#include "../rtengine/procparams.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
#include "../rtengine/rawmetadatalocation.h"
|
||||
|
||||
class CacheImageData;
|
||||
|
||||
@ -46,7 +47,7 @@ enum ActionCode {
|
||||
|
||||
AC_INVALID = 100, // invalid state
|
||||
};
|
||||
enum ByteOrder {INTEL = 0x4949, MOTOROLA = 0x4D4D};
|
||||
enum ByteOrder {UNKNOWN = 0, INTEL = 0x4949, MOTOROLA = 0x4D4D};
|
||||
#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__
|
||||
const enum ByteOrder HOSTORDER = INTEL;
|
||||
#else
|
||||
@ -309,13 +310,37 @@ public:
|
||||
class ExifManager
|
||||
{
|
||||
|
||||
static Tag* saveCIFFMNTag (FILE* f, TagDirectory* root, int len, const char* name);
|
||||
Tag* saveCIFFMNTag (TagDirectory* root, int len, const char* name);
|
||||
TagDirectory* parseIFD (int ifdOffset, bool skipIgnored);
|
||||
|
||||
public:
|
||||
static TagDirectory* parse (FILE*f, int base, bool skipIgnored = true);
|
||||
static TagDirectory* parseJPEG (FILE*f, int offset = 0); // offset: to extract exif data from a embedded preview/thumbnail
|
||||
static TagDirectory* parseTIFF (FILE*f, bool skipIgnored = true);
|
||||
static TagDirectory* parseCIFF (FILE* f, int base, int length);
|
||||
static void parseCIFF (FILE* f, int base, int length, TagDirectory* root);
|
||||
FILE* f;
|
||||
rtengine::RawMetaDataLocation *rml;
|
||||
ByteOrder order;
|
||||
bool onlyFirst; // Only first IFD
|
||||
unsigned int IFDOffset;
|
||||
unsigned int nextIFDOffset;
|
||||
|
||||
ExifManager (FILE* fHandle, rtengine::RawMetaDataLocation *rml, bool onlyFirstIFD)
|
||||
: f(fHandle), rml(rml), order(UNKNOWN), onlyFirst(onlyFirstIFD),
|
||||
IFDOffset(0), nextIFDOffset(0) {}
|
||||
|
||||
void setIFDOffset(unsigned int offset)
|
||||
{
|
||||
IFDOffset = offset;
|
||||
}
|
||||
|
||||
unsigned int getNextIFDOffset()
|
||||
{
|
||||
return nextIFDOffset;
|
||||
}
|
||||
|
||||
// The following functions parse only one IFD at a time and store the "next IFD offset"
|
||||
TagDirectory* parse (bool skipIgnored = true);
|
||||
TagDirectory* parseJPEG (int offset = 0); // offset: to extract exif data from a embedded preview/thumbnail
|
||||
TagDirectory* parseTIFF (bool skipIgnored = true);
|
||||
TagDirectory* parseCIFF ();
|
||||
void parseCIFF (int length, TagDirectory* root);
|
||||
|
||||
/// @brief Get default tag for TIFF
|
||||
/// @param forthis The byte order will be taken from the given directory.
|
||||
|
@ -539,6 +539,7 @@ const TagAttrib exifAttribs[] = {
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x0101, AUTO, "ImageHeight", &stdInterpreter},
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x0102, AUTO, "BitsPerSample", &stdInterpreter},
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x0103, AUTO, "Compression", &compressionInterpreter},
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x0153, AUTO, "SampleFormat", &stdInterpreter},
|
||||
{0, AC_WRITE, 0, nullptr, 0x828d, AUTO, "CFAPatternDim", &stdInterpreter},
|
||||
{0, AC_WRITE, 0, nullptr, 0x828e, AUTO, "CFAPattern", &cfaInterpreter},
|
||||
{0, AC_WRITE, 0, nullptr, 0x829A, AUTO, "ExposureTime", &exposureTimeInterpreter},
|
||||
@ -777,6 +778,7 @@ const TagAttrib ifdAttribs[] = {
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x013E, AUTO, "WhitePoint", &stdInterpreter},
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x013F, AUTO, "PriomaryChromaticities", &stdInterpreter},
|
||||
{0, AC_WRITE, 0, ifdAttribs, 0x014A, AUTO, "SubIFD", &stdInterpreter},
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x0153, AUTO, "SampleFormat", &stdInterpreter},
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x0201, AUTO, "JPEGInterchangeFormat", &stdInterpreter},
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x0202, AUTO, "JPEGInterchangeFormatLength", &stdInterpreter},
|
||||
{0, AC_SYSTEM, 0, nullptr, 0x0211, AUTO, "YCbCrCoefficients", &stdInterpreter},
|
||||
|
@ -25,8 +25,8 @@
|
||||
CacheImageData::CacheImageData ()
|
||||
: 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),
|
||||
fnumber(0.0), shutter(0.0), focalLen(0.0), focalLen35mm(0.0), focusDist(0.f), iso(0),
|
||||
redAWBMul(-1.0), greenAWBMul(-1.0), blueAWBMul(-1.0), rotate(0), thumbImgType(0)
|
||||
fnumber(0.0), shutter(0.0), focalLen(0.0), focalLen35mm(0.0), focusDist(0.f), iso(0), isHDR (0), isPixelShift (false),
|
||||
sampleFormat(rtengine::IIOSF_UNKNOWN), redAWBMul(-1.0), greenAWBMul(-1.0), blueAWBMul(-1.0), rotate(0), thumbImgType(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -138,6 +138,14 @@ int CacheImageData::load (const Glib::ustring& fname)
|
||||
iso = keyFile.get_integer ("ExifInfo", "ISO");
|
||||
}
|
||||
|
||||
if (keyFile.has_key ("ExifInfo", "IsHDR")) {
|
||||
isHDR = keyFile.get_integer ("ExifInfo", "IsHDR");
|
||||
}
|
||||
|
||||
if (keyFile.has_key ("ExifInfo", "IsPixelShift")) {
|
||||
isPixelShift = keyFile.get_boolean ("ExifInfo", "IsPixelShift");
|
||||
}
|
||||
|
||||
if (keyFile.has_key ("ExifInfo", "ExpComp")) {
|
||||
expcomp = keyFile.get_string ("ExifInfo", "ExpComp");
|
||||
}
|
||||
@ -160,6 +168,9 @@ int CacheImageData::load (const Glib::ustring& fname)
|
||||
if (keyFile.has_key ("FileInfo", "Filetype")) {
|
||||
filetype = keyFile.get_string ("FileInfo", "Filetype");
|
||||
}
|
||||
if (keyFile.has_key ("FileInfo", "SampleFormat")) {
|
||||
sampleFormat = (rtengine::IIO_Sample_Format)keyFile.get_integer ("FileInfo", "SampleFormat");
|
||||
}
|
||||
}
|
||||
|
||||
if (format == FT_Raw && keyFile.has_group ("ExtraRawInfo")) {
|
||||
@ -235,6 +246,8 @@ int CacheImageData::save (const Glib::ustring& fname)
|
||||
keyFile.set_double ("ExifInfo", "FocalLen35mm", focalLen35mm);
|
||||
keyFile.set_double ("ExifInfo", "FocusDist", focusDist);
|
||||
keyFile.set_integer ("ExifInfo", "ISO", iso);
|
||||
keyFile.set_integer ("ExifInfo", "IsHDR", isHDR);
|
||||
keyFile.set_boolean ("ExifInfo", "IsPixelShift", isPixelShift);
|
||||
keyFile.set_string ("ExifInfo", "ExpComp", expcomp);
|
||||
}
|
||||
|
||||
@ -242,6 +255,7 @@ int CacheImageData::save (const Glib::ustring& fname)
|
||||
keyFile.set_string ("ExifInfo", "CameraMake", camMake);
|
||||
keyFile.set_string ("ExifInfo", "CameraModel", camModel);
|
||||
keyFile.set_string ("FileInfo", "Filetype", filetype);
|
||||
keyFile.set_integer ("FileInfo", "SampleFormat", sampleFormat);
|
||||
|
||||
if (format == FT_Raw) {
|
||||
keyFile.set_integer ("ExtraRawInfo", "ThumbImageType", thumbImgType);
|
||||
|
@ -21,6 +21,7 @@
|
||||
|
||||
#include <glibmm.h>
|
||||
#include "options.h"
|
||||
#include "../rtengine/imageformat.h"
|
||||
|
||||
class CacheImageData
|
||||
{
|
||||
@ -51,6 +52,9 @@ public:
|
||||
double focalLen, focalLen35mm;
|
||||
float focusDist;
|
||||
unsigned iso;
|
||||
int isHDR; // null if no HDR, otherwise provide the number of frame for this HDR file
|
||||
bool isPixelShift;
|
||||
rtengine::IIO_Sample_Format sampleFormat;
|
||||
Glib::ustring lens;
|
||||
Glib::ustring camMake;
|
||||
Glib::ustring camModel;
|
||||
|
@ -405,7 +405,7 @@ void DynamicProfilePanel::render_fnumber (
|
||||
RENDER_RANGE_ (double, fnumber,
|
||||
[] (double f) {
|
||||
return std::string ("f/") +
|
||||
rtengine::ImageMetaData::apertureToString (f);
|
||||
rtengine::FramesMetaData::apertureToString (f);
|
||||
});
|
||||
}
|
||||
|
||||
@ -421,7 +421,7 @@ void DynamicProfilePanel::render_shutterspeed (
|
||||
Gtk::CellRenderer *cell, const Gtk::TreeModel::iterator &iter)
|
||||
{
|
||||
RENDER_RANGE_ (double, shutterspeed,
|
||||
rtengine::ImageMetaData::shutterToString);
|
||||
rtengine::FramesMetaData::shutterToString);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1268,13 +1268,14 @@ void EditorPanel::info_toggled ()
|
||||
Glib::ustring infoString2; //2-nd line
|
||||
Glib::ustring infoString3; //3-rd line
|
||||
Glib::ustring infoString4; //4-th line
|
||||
Glib::ustring infoString5; //5-th line
|
||||
Glib::ustring expcomp;
|
||||
|
||||
if (!ipc || !openThm) {
|
||||
return;
|
||||
}
|
||||
|
||||
const rtengine::ImageMetaData* idata = ipc->getInitialImage()->getMetaData();
|
||||
const rtengine::FramesMetaData* idata = ipc->getInitialImage()->getMetaData();
|
||||
|
||||
if (idata && idata->hasExif()) {
|
||||
infoString1 = Glib::ustring::compose ("%1 + %2",
|
||||
@ -1305,6 +1306,24 @@ void EditorPanel::info_toggled ()
|
||||
infoString4 = Glib::ustring::compose ("<span size=\"small\">%1 MP (%2x%3)</span>", Glib::ustring::format (std::setw (4), std::fixed, std::setprecision (1), (float)ww * hh / 1000000), ww, hh);
|
||||
|
||||
infoString = Glib::ustring::compose ("%1\n%2\n%3\n%4", infoString1, infoString2, infoString3, infoString4);
|
||||
|
||||
//adding special characteristics
|
||||
bool isHDR = idata->getHDR();
|
||||
bool isPixelShift = idata->getPixelShift();
|
||||
int numFrames = idata->getFrameCount();
|
||||
if (isHDR) {
|
||||
infoString5 = Glib::ustring::compose (M("QINFO_HDR"), numFrames);
|
||||
if (numFrames == 1) {
|
||||
int sampleFormat = idata->getSampleFormat();
|
||||
infoString5 = Glib::ustring::compose ("%1 / %2", infoString5, M(Glib::ustring::compose("SAMPLEFORMAT_%1", sampleFormat)));
|
||||
}
|
||||
} else if (isPixelShift) {
|
||||
infoString5 = Glib::ustring::compose (M("QINFO_PIXELSHIFT"), numFrames);
|
||||
}
|
||||
if (!infoString5.empty()) {
|
||||
infoString = Glib::ustring::compose ("%1\n%2", infoString, infoString5);
|
||||
}
|
||||
|
||||
} else {
|
||||
infoString = M ("QINFO_NOEXIF");
|
||||
}
|
||||
|
@ -177,15 +177,28 @@ void ExifPanel::setDefaults (const ProcParams* defParams, const ParamsEdited* pe
|
||||
defChangeList = defParams->exif;
|
||||
}
|
||||
|
||||
void ExifPanel::setImageData (const ImageMetaData* id)
|
||||
void ExifPanel::setImageData (const FramesMetaData* id)
|
||||
{
|
||||
|
||||
idata = id;
|
||||
exifTreeModel->clear ();
|
||||
|
||||
if (id && id->getExifData ()) {
|
||||
// id->getExifData ()->printAll ();
|
||||
addDirectory (id->getExifData (), exifTreeModel->children());
|
||||
if (id) {
|
||||
//bool first = true;
|
||||
// HOMBRE: Should we only display the current frame's Exifs ?
|
||||
for (int frameNum = 0; frameNum < id->getFrameCount (); ++frameNum) {
|
||||
if ( id->getExifData (frameNum)) {
|
||||
/*
|
||||
if (!first) {
|
||||
Gtk::Separator *sep = Gtk::manage (new Gtk::Separator);
|
||||
sep->set_orientation(Gtk::ORIENTATION_HORIZONTAL);
|
||||
first = false;
|
||||
}
|
||||
*/
|
||||
//id->getExifData ()->printAll ();
|
||||
addDirectory (id->getExifData (frameNum), exifTreeModel->children());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,7 +26,7 @@ class ExifPanel : public Gtk::VBox, public ToolPanel
|
||||
{
|
||||
|
||||
private:
|
||||
const rtengine::ImageMetaData* idata;
|
||||
const rtengine::FramesMetaData* idata;
|
||||
rtengine::procparams::ExifPairs changeList;
|
||||
rtengine::procparams::ExifPairs defChangeList;
|
||||
bool recursiveOp;
|
||||
@ -91,7 +91,7 @@ public:
|
||||
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
|
||||
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
|
||||
|
||||
void setImageData (const rtengine::ImageMetaData* id);
|
||||
void setImageData (const rtengine::FramesMetaData* id);
|
||||
|
||||
void exifSelectionChanged ();
|
||||
void removePressed ();
|
||||
|
@ -1539,8 +1539,8 @@ bool FileBrowser::checkFilter (ThumbBrowserEntryBase* entryb) // true -> entry
|
||||
&& (!filter.exifFilter.filterExpComp || filter.exifFilter.expcomp.count(cfs->expcomp) > 0);
|
||||
|
||||
return
|
||||
(!filter.exifFilter.filterShutter || (rtengine::ImageMetaData::shutterFromString(rtengine::ImageMetaData::shutterToString(cfs->shutter)) >= filter.exifFilter.shutterFrom - tol2 && rtengine::ImageMetaData::shutterFromString(rtengine::ImageMetaData::shutterToString(cfs->shutter)) <= filter.exifFilter.shutterTo + tol2))
|
||||
&& (!filter.exifFilter.filterFNumber || (rtengine::ImageMetaData::apertureFromString(rtengine::ImageMetaData::apertureToString(cfs->fnumber)) >= filter.exifFilter.fnumberFrom - tol2 && rtengine::ImageMetaData::apertureFromString(rtengine::ImageMetaData::apertureToString(cfs->fnumber)) <= filter.exifFilter.fnumberTo + tol2))
|
||||
(!filter.exifFilter.filterShutter || (rtengine::FramesMetaData::shutterFromString(rtengine::FramesMetaData::shutterToString(cfs->shutter)) >= filter.exifFilter.shutterFrom - tol2 && rtengine::FramesMetaData::shutterFromString(rtengine::FramesMetaData::shutterToString(cfs->shutter)) <= filter.exifFilter.shutterTo + tol2))
|
||||
&& (!filter.exifFilter.filterFNumber || (rtengine::FramesMetaData::apertureFromString(rtengine::FramesMetaData::apertureToString(cfs->fnumber)) >= filter.exifFilter.fnumberFrom - tol2 && rtengine::FramesMetaData::apertureFromString(rtengine::FramesMetaData::apertureToString(cfs->fnumber)) <= filter.exifFilter.fnumberTo + tol2))
|
||||
&& (!filter.exifFilter.filterFocalLen || (cfs->focalLen >= filter.exifFilter.focalFrom - tol && cfs->focalLen <= filter.exifFilter.focalTo + tol))
|
||||
&& (!filter.exifFilter.filterISO || (cfs->iso >= filter.exifFilter.isoFrom && cfs->iso <= filter.exifFilter.isoTo))
|
||||
&& (!filter.exifFilter.filterExpComp || filter.exifFilter.expcomp.count(cfs->expcomp) > 0)
|
||||
|
@ -770,6 +770,8 @@ void FileCatalog::previewReady (int dir_id, FileBrowserEntry* fdn)
|
||||
if (cfs->focalLen > dirEFS.focalTo) {
|
||||
dirEFS.focalTo = cfs->focalLen;
|
||||
}
|
||||
|
||||
//TODO: ass filters for HDR and PixelShift files
|
||||
}
|
||||
|
||||
dirEFS.filetypes.insert (cfs->filetype);
|
||||
|
@ -171,15 +171,15 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists)
|
||||
}
|
||||
|
||||
// enaFNumber->set_active (curefs.filterFNumber);
|
||||
fnumberFrom->set_text (ImageMetaData::apertureToString (defefs.fnumberFrom));
|
||||
fnumberFrom->set_text (FramesMetaData::apertureToString (defefs.fnumberFrom));
|
||||
curefs.fnumberFrom = defefs.fnumberFrom;
|
||||
fnumberTo->set_text (ImageMetaData::apertureToString (defefs.fnumberTo));
|
||||
fnumberTo->set_text (FramesMetaData::apertureToString (defefs.fnumberTo));
|
||||
curefs.fnumberTo = defefs.fnumberTo;
|
||||
|
||||
// enaShutter->set_active (curefs.filterShutter);
|
||||
shutterFrom->set_text (ImageMetaData::shutterToString (defefs.shutterFrom));
|
||||
shutterFrom->set_text (FramesMetaData::shutterToString (defefs.shutterFrom));
|
||||
curefs.shutterFrom = defefs.shutterFrom;
|
||||
shutterTo->set_text (ImageMetaData::shutterToString (defefs.shutterTo));
|
||||
shutterTo->set_text (FramesMetaData::shutterToString (defefs.shutterTo));
|
||||
curefs.shutterTo = defefs.shutterTo;
|
||||
|
||||
// enaISO->set_active (curefs.filterISO);
|
||||
@ -315,8 +315,8 @@ ExifFilterSettings FilterPanel::getFilter ()
|
||||
efs.focalTo = atof (focalTo->get_text().c_str());
|
||||
efs.isoFrom = atoi (isoFrom->get_text().c_str());
|
||||
efs.isoTo = atoi (isoTo->get_text().c_str());
|
||||
efs.shutterFrom = ImageMetaData::shutterFromString (shutterFrom->get_text());
|
||||
efs.shutterTo = ImageMetaData::shutterFromString (shutterTo->get_text());
|
||||
efs.shutterFrom = FramesMetaData::shutterFromString (shutterFrom->get_text());
|
||||
efs.shutterTo = FramesMetaData::shutterFromString (shutterTo->get_text());
|
||||
|
||||
efs.filterFNumber = enaFNumber->get_active ();
|
||||
efs.filterShutter = enaShutter->get_active ();
|
||||
|
@ -958,7 +958,7 @@ void ICMPanel::oBPCChanged ()
|
||||
}
|
||||
}
|
||||
|
||||
void ICMPanel::setRawMeta (bool raw, const rtengine::ImageData* pMeta)
|
||||
void ICMPanel::setRawMeta (bool raw, const rtengine::FramesData* pMeta)
|
||||
{
|
||||
|
||||
disableListener ();
|
||||
|
@ -122,7 +122,7 @@ public:
|
||||
void applyBaselineExposureOffsetChanged();
|
||||
void applyHueSatMapChanged();
|
||||
|
||||
void setRawMeta (bool raw, const rtengine::ImageData* pMeta);
|
||||
void setRawMeta (bool raw, const rtengine::FramesData* pMeta);
|
||||
void saveReferencePressed ();
|
||||
|
||||
void setICMPanelListener (ICMPanelListener* ipl)
|
||||
|
@ -59,7 +59,7 @@ InspectorBuffer::~InspectorBuffer() {
|
||||
//int InspectorBuffer::infoFromImage (const Glib::ustring& fname)
|
||||
//{
|
||||
//
|
||||
// rtengine::ImageMetaData* idata = rtengine::ImageMetaData::fromFile (fname, nullptr);
|
||||
// rtengine::FramesMetaData* idata = rtengine::FramesMetaData::fromFile (fname, nullptr, true);
|
||||
//
|
||||
// if (!idata) {
|
||||
// return 0;
|
||||
|
@ -434,7 +434,7 @@ void IPTCPanel::setDefaults (const ProcParams* defParams, const ParamsEdited* pe
|
||||
defChangeList = defParams->iptc;
|
||||
}
|
||||
|
||||
void IPTCPanel::setImageData (const ImageMetaData* id)
|
||||
void IPTCPanel::setImageData (const FramesMetaData* id)
|
||||
{
|
||||
|
||||
if (id) {
|
||||
|
@ -75,7 +75,7 @@ public:
|
||||
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
|
||||
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
|
||||
|
||||
void setImageData (const rtengine::ImageMetaData* id);
|
||||
void setImageData (const rtengine::FramesMetaData* id);
|
||||
|
||||
void notifyListener ();
|
||||
|
||||
|
@ -110,7 +110,7 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa
|
||||
conUseDist.block(false);
|
||||
}
|
||||
|
||||
void LensProfilePanel::setRawMeta(bool raw, const rtengine::ImageMetaData* pMeta)
|
||||
void LensProfilePanel::setRawMeta(bool raw, const rtengine::FramesMetaData* pMeta)
|
||||
{
|
||||
if (!raw || pMeta->getFocusDist() <= 0) {
|
||||
disableListener();
|
||||
|
@ -47,7 +47,7 @@ public:
|
||||
|
||||
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
|
||||
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
|
||||
void setRawMeta (bool raw, const rtengine::ImageMetaData* pMeta);
|
||||
void setRawMeta (bool raw, const rtengine::FramesMetaData* pMeta);
|
||||
|
||||
void onLCPFileChanged ();
|
||||
void onLCPFileReset ();
|
||||
|
@ -227,14 +227,17 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu
|
||||
|
||||
if (!run_cpb) {
|
||||
if (defProf == DEFPROFILE_DYNAMIC && create && cfs && cfs->exifValid) {
|
||||
rtengine::ImageMetaData* imageMetaData;
|
||||
rtengine::FramesMetaData* imageMetaData;
|
||||
if (getType() == FT_Raw) {
|
||||
rtengine::RawMetaDataLocation metaData = rtengine::Thumbnail::loadMetaDataFromRaw(fname);
|
||||
imageMetaData = rtengine::ImageMetaData::fromFile (fname, &metaData);
|
||||
// Should we ask all frame's MetaData ?
|
||||
imageMetaData = rtengine::FramesMetaData::fromFile (fname, &metaData, true);
|
||||
} else {
|
||||
imageMetaData = rtengine::ImageMetaData::fromFile (fname, nullptr);
|
||||
// Should we ask all frame's MetaData ?
|
||||
imageMetaData = rtengine::FramesMetaData::fromFile (fname, nullptr, true);
|
||||
}
|
||||
PartialProfile *pp = ProfileStore::getInstance()->loadDynamicProfile(imageMetaData);
|
||||
delete imageMetaData;
|
||||
int err = pp->pparams->save(outFName);
|
||||
pp->deleteInstance();
|
||||
delete pp;
|
||||
@ -249,13 +252,15 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu
|
||||
}
|
||||
} else {
|
||||
// First generate the communication file, with general values and EXIF metadata
|
||||
rtengine::ImageMetaData* imageMetaData;
|
||||
rtengine::FramesMetaData* imageMetaData;
|
||||
|
||||
if (getType() == FT_Raw) {
|
||||
rtengine::RawMetaDataLocation metaData = rtengine::Thumbnail::loadMetaDataFromRaw(fname);
|
||||
imageMetaData = rtengine::ImageMetaData::fromFile (fname, &metaData);
|
||||
// Should we ask all frame's MetaData ?
|
||||
imageMetaData = rtengine::FramesMetaData::fromFile (fname, &metaData, true);
|
||||
} else {
|
||||
imageMetaData = rtengine::ImageMetaData::fromFile (fname, nullptr);
|
||||
// Should we ask all frame's MetaData ?
|
||||
imageMetaData = rtengine::FramesMetaData::fromFile (fname, nullptr, true);
|
||||
}
|
||||
|
||||
Glib::ustring tmpFileName( Glib::build_filename(options.cacheBaseDir, Glib::ustring::compose("CPB_temp_%1.txt", index++)) );
|
||||
@ -268,6 +273,7 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu
|
||||
cfs,
|
||||
flaggingMode);
|
||||
}
|
||||
delete imageMetaData;
|
||||
|
||||
// For the filename etc. do NOT use streams, since they are not UTF8 safe
|
||||
Glib::ustring cmdLine = options.CPBPath + Glib::ustring(" \"") + tmpFileName + Glib::ustring("\"");
|
||||
@ -284,8 +290,6 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu
|
||||
}
|
||||
|
||||
g_remove (tmpFileName.c_str ());
|
||||
|
||||
delete imageMetaData;
|
||||
}
|
||||
|
||||
if (returnParams && hasProcParams()) {
|
||||
@ -645,7 +649,7 @@ void Thumbnail::generateExifDateTimeStrings ()
|
||||
return;
|
||||
}
|
||||
|
||||
exifString = Glib::ustring::compose ("f/%1 %2s %3%4 %5mm", Glib::ustring(rtengine::ImageData::apertureToString(cfs.fnumber)), Glib::ustring(rtengine::ImageData::shutterToString(cfs.shutter)), M("QINFO_ISO"), cfs.iso, Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), cfs.focalLen));
|
||||
exifString = Glib::ustring::compose ("f/%1 %2s %3%4 %5mm", Glib::ustring(rtengine::FramesData::apertureToString(cfs.fnumber)), Glib::ustring(rtengine::FramesData::shutterToString(cfs.shutter)), M("QINFO_ISO"), cfs.iso, Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), cfs.focalLen));
|
||||
|
||||
if (options.fbShowExpComp && cfs.expcomp != "0.00" && cfs.expcomp != "") { // don't show exposure compensation if it is 0.00EV;old cache iles do not have ExpComp, so value will not be displayed.
|
||||
exifString = Glib::ustring::compose ("%1 %2EV", exifString, cfs.expcomp); // append exposure compensation to exifString
|
||||
@ -712,7 +716,7 @@ ThFileType Thumbnail::getType ()
|
||||
int Thumbnail::infoFromImage (const Glib::ustring& fname, rtengine::RawMetaDataLocation* rml)
|
||||
{
|
||||
|
||||
rtengine::ImageMetaData* idata = rtengine::ImageMetaData::fromFile (fname, rml);
|
||||
rtengine::FramesMetaData* idata = rtengine::FramesMetaData::fromFile (fname, rml);
|
||||
|
||||
if (!idata) {
|
||||
return 0;
|
||||
@ -730,6 +734,9 @@ int Thumbnail::infoFromImage (const Glib::ustring& fname, rtengine::RawMetaDataL
|
||||
cfs.focusDist = idata->getFocusDist ();
|
||||
cfs.iso = idata->getISOSpeed ();
|
||||
cfs.expcomp = idata->expcompToString (idata->getExpComp(), false); // do not mask Zero expcomp
|
||||
cfs.isHDR = idata->getHDR ();
|
||||
cfs.isPixelShift = idata->getPixelShift ();
|
||||
cfs.sampleFormat = idata->getSampleFormat ();
|
||||
cfs.year = 1900 + idata->getDateTime().tm_year;
|
||||
cfs.month = idata->getDateTime().tm_mon + 1;
|
||||
cfs.day = idata->getDateTime().tm_mday;
|
||||
|
@ -510,7 +510,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool
|
||||
toneCurve->enableListener ();
|
||||
|
||||
if (ipc) {
|
||||
const rtengine::ImageMetaData* pMetaData = ipc->getInitialImage()->getMetaData();
|
||||
const rtengine::FramesMetaData* pMetaData = ipc->getInitialImage()->getMetaData();
|
||||
exifpanel->setImageData (pMetaData);
|
||||
iptcpanel->setImageData (pMetaData);
|
||||
|
||||
@ -528,7 +528,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool
|
||||
ipc->setImageTypeListener (this);
|
||||
flatfield->setShortcutPath(Glib::path_get_dirname(ipc->getInitialImage()->getFileName()));
|
||||
|
||||
icm->setRawMeta (raw, (const rtengine::ImageData*)pMetaData);
|
||||
icm->setRawMeta (raw, (const rtengine::FramesData*)pMetaData);
|
||||
lensProf->setRawMeta (raw, pMetaData);
|
||||
}
|
||||
|
||||
@ -677,7 +677,7 @@ rtengine::RawImage* ToolPanelCoordinator::getDF()
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const rtengine::ImageMetaData *imd = ipc->getInitialImage()->getMetaData();
|
||||
const rtengine::FramesMetaData *imd = ipc->getInitialImage()->getMetaData();
|
||||
|
||||
if(imd) {
|
||||
int iso = imd->getISOSpeed();
|
||||
@ -698,7 +698,7 @@ rtengine::RawImage* ToolPanelCoordinator::getFF()
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const rtengine::ImageMetaData *imd = ipc->getInitialImage()->getMetaData();
|
||||
const rtengine::FramesMetaData *imd = ipc->getInitialImage()->getMetaData();
|
||||
|
||||
if(imd) {
|
||||
// int iso = imd->getISOSpeed(); temporarilly removed because unused
|
||||
|
355
tools/source_icons/scalable/HDR-thumbnail.svg
Normal file
355
tools/source_icons/scalable/HDR-thumbnail.svg
Normal file
@ -0,0 +1,355 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="2113.1729"
|
||||
height="896.78442"
|
||||
id="svg2"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="HDR-thumbnail.svg"
|
||||
inkscape:export-filename="/home/philippe/devel/rawtherapee/icons/NewIcons/processing.png"
|
||||
inkscape:export-xdpi="1.8"
|
||||
inkscape:export-ydpi="1.8"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs4">
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect3669"
|
||||
is_visible="true" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 36 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="72 : 36 : 1"
|
||||
inkscape:persp3d-origin="36 : 24 : 1"
|
||||
id="perspective21" />
|
||||
<inkscape:perspective
|
||||
id="perspective3614"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3636"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3658"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3680"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3680-0"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3680-8"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3720"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-2"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-26"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-0"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3836"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2861"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2871"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2906"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2912"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2861-9"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2911"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
y2="45.017357"
|
||||
x2="20.758585"
|
||||
y1="1"
|
||||
x1="20.758585"
|
||||
gradientTransform="matrix(1.6744133,0,0,1.6744133,7.8140536,-64.51142)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient4427"
|
||||
xlink:href="#linearGradient3904"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="18.083122"
|
||||
x2="11"
|
||||
y1="3.9374998"
|
||||
x1="11"
|
||||
id="linearGradient3904">
|
||||
<stop
|
||||
id="stop3906"
|
||||
offset="0"
|
||||
style="stop-color:#323232;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3908"
|
||||
offset="1"
|
||||
style="stop-color:#787878;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<inkscape:perspective
|
||||
id="perspective2881"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective8938"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective8993"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4055"
|
||||
id="linearGradient6633"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-786.3324"
|
||||
y1="356.60675"
|
||||
x2="80.769913"
|
||||
y2="356.60675" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4055">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4057" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4059" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641"
|
||||
id="linearGradient6635"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-782.90625"
|
||||
y1="86.34375"
|
||||
x2="-643.34375"
|
||||
y2="86.34375" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3641">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3643" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3645" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="86.34375"
|
||||
x2="-643.34375"
|
||||
y1="86.34375"
|
||||
x1="-782.90625"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient9014"
|
||||
xlink:href="#linearGradient3641"
|
||||
inkscape:collect="always" />
|
||||
<inkscape:perspective
|
||||
id="perspective9605"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective9627"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.22772277"
|
||||
inkscape:cx="197.17196"
|
||||
inkscape:cy="610.73868"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g4185"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1028"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
showgrid="true"
|
||||
showborder="true"
|
||||
inkscape:showpageshadow="true"
|
||||
inkscape:window-maximized="1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-left="0" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(619.48357,402.74312)">
|
||||
<g
|
||||
id="g4082"
|
||||
transform="translate(0,1.552561)">
|
||||
<g
|
||||
id="g4060"
|
||||
transform="matrix(1.5074827,0,0,1.5074827,-9.4212231,-17.89429)">
|
||||
<g
|
||||
id="g4185">
|
||||
<g
|
||||
id="g4204">
|
||||
<path
|
||||
d="m -351.62109,-203.25391 1295.65234,0 0,488.75 -1295.65234,0 0,-488.75 z m -53.06836,-53.06836 0,26.53516 0,568.35352 1401.78906,0 0,-594.88868 -1401.78906,0 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:53.06860352;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
id="rect4183"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 700.14672,-59.339182 27.81641,0 c 14.43414,0 23.43824,2.863359 27.34765,5.837891 l 0.11719,0.08789 0.11914,0.08594 c 4.05272,2.931768 6.13867,6.665699 6.13867,15.820312 0,16.36961 -4.25084,26.440517 -12.12695,33.5058588 l -0.0332,0.0293 -0.0332,0.03125 C 741.79089,3.0710746 729.48149,7.3932446 710.60181,7.3932446 l -23.69727,0 13.24219,-66.7324206 z m -98.98632,-90.705078 -73.95312,379.41992 116.35741,0 26.39649,-134.369141 19.23632,0 c 12.73341,0 20.56842,2.85432 25.27734,6.974611 l 0.0996,0.0898 0.10352,0.0859 c 4.68415,3.91942 10.87634,13.943 15.91016,30.37695 l 29.23632,96.8418 116.48633,0 -34.89062,-116.48828 c -6.4465,-21.653291 -13.97773,-38.342623 -23.89258,-50.371094 -2.04965,-2.519431 -4.32062,-4.76638 -6.64648,-6.931641 15.5851,-6.151449 29.12924,-15.604724 40.01562,-28.341798 17.86964,-20.9074884 26.70313,-47.841763 26.70312,-78.781249 0,-31.259676 -12.06242,-57.523168 -35.23632,-74.310548 -23.16041,-16.7776 -55.33107,-24.19531 -95.85157,-24.19531 l -145.35155,0 z m -305.76562,96.470703 22.08789,0 c 30.23822,0 51.12154,6.673279 64.29297,18.166016 l 0.0215,0.01758 0.0234,0.01953 c 13.36002,11.544086 20.2793,28.1493898 20.27929,53.333983 0,38.26715 -11.19725,66.707731 -33.60156,88.255858 -22.38765,21.5321 -52.50022,32.50977 -92.87109,32.50977 l -18.01758,0 37.78516,-192.302736 z m -98.53125,-93.558593 -1.91797,9.84765 -72.03321,369.57227 111.33399,0 c 57.89899,0 100.96244,-3.51646 130.56642,-11.33985 l 0.0176,-0.004 c 29.26994,-7.69631 55.28946,-20.7981 77.58788,-39.19531 25.33104,-20.47564 45.10088,-45.92262 58.99415,-75.875 14.05975,-30.128077 21.12109,-62.369774 21.12109,-96.2343774 0,-24.5047836 -4.13156,-46.8908876 -12.625,-66.8300776 -8.49363,-20.097353 -21.32774,-37.410784 -38.11914,-51.433595 -16.87374,-14.22378 -37.84828,-24.1125 -62.31446,-29.85352 -24.78667,-5.9761 -59.81886,-8.65429 -106.25976,-8.65429 l -106.35156,0 z m -408.09962,-2.91211 -1.91992,9.8457 -72.03321,369.57422 116.37891,0 29.25195,-150.541014 110.035163,0 -29.251962,150.541014 116.363297,0 73.953122,-379.41992 -116.386725,0 -26.162111,135.320312 -110.251954,0 26.398438,-135.320312 -116.374998,0 z m -140.385,-53.20965 1295.65234,0 0,488.75 -1295.65234,0 0,-488.75 z"
|
||||
style="color:#000000;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:24.3528614;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
id="path7881"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 700.14672,-59.339182 27.81641,0 c 14.43414,0 23.43824,2.863361 27.34765,5.837891 l 0.11719,0.0879 0.11914,0.0859 c 4.05272,2.93177 6.13867,6.6657 6.13867,15.820311 0,16.369611 -4.25084,26.440522 -12.12695,33.5058628 l -0.0332,0.0293 -0.0332,0.0312 C 741.79089,3.0709924 729.48149,7.3931634 710.60181,7.3931634 l -23.69727,0 13.24219,-66.7324154 z m -98.98632,-90.705078 -73.95312,379.41992 116.35741,0 26.39649,-134.369141 19.23632,0 c 12.73341,0 20.56842,2.85432 25.27734,6.974611 l 0.0996,0.0898 0.10352,0.0859 c 4.68415,3.91942 10.87634,13.943 15.91016,30.37695 l 29.23632,96.8418 116.48633,0 -34.89062,-116.48828 c -6.4465,-21.653291 -13.97773,-38.342622 -23.89258,-50.371093 -2.04965,-2.519431 -4.32062,-4.766381 -6.64648,-6.931641 15.5851,-6.15145 29.12924,-15.604721 40.01562,-28.341802 17.86964,-20.9074816 26.70313,-47.841763 26.70312,-78.781245 0,-31.259682 -12.06242,-57.523169 -35.23632,-74.310549 -23.16041,-16.7776 -55.33107,-24.19531 -95.85157,-24.19531 l -145.35155,0 z m -305.76562,96.470699 22.08789,0 c 30.23822,0 51.12154,6.67328 64.29297,18.166021 l 0.0215,0.0176 0.0234,0.0195 c 13.36002,11.544081 20.2793,28.1493918 20.27929,53.333983 0,38.267153 -11.19725,66.707725 -33.60156,88.255857 -22.38765,21.5321 -52.50022,32.50977 -92.87109,32.50977 l -18.01758,0 37.78516,-192.302741 z m -98.53125,-93.558589 -1.91797,9.84765 -72.03321,369.57227 111.33399,0 c 57.89899,0 100.96244,-3.51646 130.56642,-11.33985 l 0.0176,-0.004 c 29.26994,-7.69631 55.28946,-20.7981 77.58788,-39.19531 25.33104,-20.47564 45.10088,-45.92262 58.99415,-75.875 14.05975,-30.128082 21.12109,-62.369775 21.12109,-96.2343766 0,-24.5047814 -4.13156,-46.8908934 -12.625,-66.8300744 -8.49363,-20.097362 -21.32774,-37.410793 -38.11914,-51.433599 -16.87374,-14.22378 -37.84828,-24.1125 -62.31446,-29.85352 -24.78667,-5.9761 -59.81886,-8.65429 -106.25976,-8.65429 l -106.35156,0 z m -408.09962,-2.91211 -1.91992,9.8457 -72.03321,369.57422 116.37891,0 29.25195,-150.541012 110.035163,0 -29.251962,150.541012 116.363297,0 73.953122,-379.41992 -116.386725,0 -26.162111,135.320312 -110.251954,0 26.398438,-135.320312 -116.374998,0 z"
|
||||
style="color:#000000;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:24.3528614;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
id="path4201" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 18 KiB |
353
tools/source_icons/scalable/PixeShift-thumbnail.svg
Normal file
353
tools/source_icons/scalable/PixeShift-thumbnail.svg
Normal file
@ -0,0 +1,353 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1393.1727"
|
||||
height="896.78442"
|
||||
id="svg2"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="PixeShift-thumbnail.svg"
|
||||
inkscape:export-filename="/home/philippe/devel/rawtherapee/icons/NewIcons/processing.png"
|
||||
inkscape:export-xdpi="1.8"
|
||||
inkscape:export-ydpi="1.8"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs4">
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect3669"
|
||||
is_visible="true" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 36 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="72 : 36 : 1"
|
||||
inkscape:persp3d-origin="36 : 24 : 1"
|
||||
id="perspective21" />
|
||||
<inkscape:perspective
|
||||
id="perspective3614"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3636"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3658"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3680"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3680-0"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3680-8"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3720"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-2"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-26"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-0"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3836"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2861"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2871"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2906"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2912"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2861-9"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2911"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
y2="45.017357"
|
||||
x2="20.758585"
|
||||
y1="1"
|
||||
x1="20.758585"
|
||||
gradientTransform="matrix(1.6744133,0,0,1.6744133,7.8140536,-64.51142)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient4427"
|
||||
xlink:href="#linearGradient3904"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="18.083122"
|
||||
x2="11"
|
||||
y1="3.9374998"
|
||||
x1="11"
|
||||
id="linearGradient3904">
|
||||
<stop
|
||||
id="stop3906"
|
||||
offset="0"
|
||||
style="stop-color:#323232;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3908"
|
||||
offset="1"
|
||||
style="stop-color:#787878;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<inkscape:perspective
|
||||
id="perspective2881"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective8938"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective8993"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4055"
|
||||
id="linearGradient6633"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-786.3324"
|
||||
y1="356.60675"
|
||||
x2="80.769913"
|
||||
y2="356.60675" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4055">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4057" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4059" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641"
|
||||
id="linearGradient6635"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-782.90625"
|
||||
y1="86.34375"
|
||||
x2="-643.34375"
|
||||
y2="86.34375" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3641">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3643" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3645" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="86.34375"
|
||||
x2="-643.34375"
|
||||
y1="86.34375"
|
||||
x1="-782.90625"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient9014"
|
||||
xlink:href="#linearGradient3641"
|
||||
inkscape:collect="always" />
|
||||
<inkscape:perspective
|
||||
id="perspective9605"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective9627"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.22772277"
|
||||
inkscape:cx="701.93811"
|
||||
inkscape:cy="252.09671"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g4185"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1028"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
showgrid="true"
|
||||
showborder="true"
|
||||
inkscape:showpageshadow="true"
|
||||
inkscape:window-maximized="1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-left="0" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(619.48357,402.74312)">
|
||||
<g
|
||||
id="g4082"
|
||||
transform="translate(0,1.552561)">
|
||||
<g
|
||||
id="g4060"
|
||||
transform="matrix(1.5074827,0,0,1.5074827,-9.4212231,-17.89429)">
|
||||
<g
|
||||
id="g4185">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect4183"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:53.06860352;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m -351.62109,-203.25391 818.03492,0 0,488.75 -818.03492,0 z m -53.06836,-53.06836 0,26.53516 0,568.35352 924.17164,0 0,-594.88868 z"
|
||||
sodipodi:nodetypes="ccccccccccc" />
|
||||
<path
|
||||
id="path4229"
|
||||
style="color:#000000;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:35.39651489;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 265.62781,-155.05765 c -49.1457,0 -90.4877,11.63079 -121.78711,36.28125 -0.002,10e-4 -0.004,0.002 -0.006,0.004 -0.001,0.001 -0.002,0.003 -0.004,0.004 -31.08988,24.457406 -47.765635,59.560878 -47.765635,99.859382 0,26.1255302 8.009915,49.737922 24.222665,67.476564 16.19944,17.724111 39.53693,29.424012 68.50195,36.582032 l 36.05273,8.955081 c 18.27024,4.67899 29.8783,10.548831 30.33985,10.935541 l 0.10937,0.0918 0.11133,0.0898 c 1.57451,1.27663 1.97461,1.35886 1.97461,5.83984 0,7.0758 -1.84688,10.95839 -11.08203,16.9668 l -0.041,0.0273 -0.041,0.0274 c -8.95459,5.89692 -21.71423,9.52734 -39.58008,9.52734 -16.90162,0 -34.1879,-2.62042 -52.0293,-8 -0.004,-0.001 -0.008,-0.003 -0.0117,-0.004 -17.68141,-5.37871 -36.26581,-13.62326 -55.697265,-24.87305 L 77.246756,92.200239 55.860037,206.14163 l 13.724609,5.3086 c 22.036745,8.52517 44.595704,14.97175 67.626954,19.32031 l 0.01,0.002 0.0117,0.002 c 23.18039,4.34633 46.48636,6.52539 69.86133,6.5254 50.55671,0 93.03102,-12.12298 125.0957,-37.73047 32.12994,-25.53805 49.30469,-61.90037 49.30469,-103.716791 0,-26.672502 -8.93503,-50.831674 -26.49414,-68.613285 C 337.53461,9.2432032 312.19246,-2.7878274 279.87002,-10.950058 l -0.0469,-0.0117 -36.48437,-9.005861 -0.0293,-0.008 c -15.93799,-3.8768 -26.07364,-8.70118 -27.02148,-9.37109 -1.11715,-0.90115 -1.4043,-1.10446 -1.4043,-4.541011 0,-6.37617 1.03633,-8.65757 9.36719,-13.351571 8.55572,-4.74234 22.96524,-8.12695 43.2207,-8.12695 14.55805,0 29.58489,1.93667 45.17969,5.90625 l 0.0723,0.0176 0.0742,0.0195 c 15.51091,3.807221 31.42298,9.703661 47.75,17.794922 l 20.76367,10.29102 21.89649,-111.599621 -15.73828,-4.41016 c -20.94077,-5.86976 -41.63365,-10.25499 -62.07422,-13.13672 l -0.0274,-0.004 c -20.315,-3.03795 -40.23336,-4.57032 -59.74023,-4.57032 z m -374.4375,105.914079 34.068354,0 c 12.286972,0 19.089561,2.70039 22.697266,5.742181 l 0.06445,0.0527 0.06445,0.0547 c 3.78294,3.12821 5.564453,6.27875 5.564453,14.935551 0,15.261321 -3.764544,23.5142316 -10.652343,29.6367216 -6.92581,6.1562806 -18.056251,10.2773404 -36.173829,10.2773404 l -27.568361,0 11.93555,-60.699214 z m -105.64648,-99.691419 -2.78907,14.3125 -71.16992,365.14063 124.81055,0 23.04492,-119.37109 43.925776,0 c 29.780569,0 55.131204,-2.96625 76.431641,-9.54687 l 0.0625,-0.0195 0.0625,-0.0195 C 1.1781386,94.921679 20.010872,83.952138 35.651243,69.014707 l 0.0293,-0.0273 0.02734,-0.0254 C 49.987967,55.204376 61.12506,38.939885 68.787961,20.653414 l 0.01172,-0.0273 0.0098,-0.0274 c 7.643691,-18.4143414 11.492187,-37.980452 11.492187,-58.173824 0,-33.426612 -12.798296,-62.75382 -37.203125,-82.41603 -24.257058,-19.8177 -56.934123,-28.84375 -95.716797,-28.84375 l -161.837886,0 z m -137.16492,-54.41892 818.03492,0 0,488.75 -818.03492,0 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 265.62781,-155.05764 c -49.1457,0 -90.4877,11.63079 -121.78711,36.28125 -0.002,0.001 -0.004,0.002 -0.006,0.004 -0.001,0.001 -0.002,0.003 -0.004,0.004 -31.08988,24.4574 -47.765635,59.56087 -47.765635,99.85937 0,26.12553 8.009915,49.73792 24.222665,67.47656 16.19944,17.72411 39.53693,29.42401 68.50195,36.58203 l 36.05273,8.95508 c 18.27024,4.67899 29.8783,10.54884 30.33985,10.93555 l 0.10937,0.0918 0.11133,0.0898 c 1.57451,1.27663 1.97461,1.35886 1.97461,5.83984 0,7.0758 -1.84688,10.95839 -11.08203,16.9668 l -0.041,0.0273 -0.041,0.0274 c -8.95459,5.89692 -21.71423,9.52734 -39.58008,9.52734 -16.90162,0 -34.1879,-2.62042 -52.0293,-8 -0.004,-0.001 -0.008,-0.003 -0.0117,-0.004 -17.68141,-5.37871 -36.26581,-13.62326 -55.697265,-24.87305 l -21.648439,-12.5332 -21.386719,113.9414 13.724609,5.3086 c 22.036745,8.52516 44.595704,14.97175 67.626954,19.32031 l 0.01,0.002 0.0117,0.002 c 23.18039,4.34633 46.48636,6.52539 69.86133,6.5254 50.55671,0 93.03102,-12.12298 125.0957,-37.73047 32.12994,-25.53805 49.30469,-61.90037 49.30469,-103.7168 0,-26.6725 -8.93503,-50.83167 -26.49414,-68.61328 C 337.53461,9.2432 312.19246,-2.78783 279.87002,-10.95006 l -0.0469,-0.0117 -36.48437,-9.00586 -0.0293,-0.008 c -15.93799,-3.8768 -26.07364,-8.70118 -27.02148,-9.37109 -1.11715,-0.90115 -1.4043,-1.10446 -1.4043,-4.54101 0,-6.37617 1.03633,-8.65757 9.36719,-13.35157 8.55572,-4.74234 22.96524,-8.12695 43.2207,-8.12695 14.55805,0 29.58489,1.93667 45.17969,5.90625 l 0.0723,0.0176 0.0742,0.0195 c 15.51091,3.80722 31.42298,9.70366 47.75,17.79492 l 20.76367,10.29102 21.89649,-111.59961 -15.73828,-4.41016 c -20.94077,-5.86976 -41.63365,-10.25499 -62.07422,-13.13672 l -0.0274,-0.004 c -20.315,-3.03795 -40.23336,-4.57032 -59.74023,-4.57032 z m -374.4375,105.91407 34.068354,0 c 12.286972,0 19.089561,2.70039 22.697266,5.74218 l 0.06445,0.0527 0.06445,0.0547 c 3.78294,3.12821 5.564453,6.27875 5.564453,14.93555 0,15.26132 -3.764544,23.51423 -10.652343,29.63672 -6.92581,6.15628 -18.056251,10.27734 -36.173829,10.27734 l -27.568361,0 11.93555,-60.69921 z m -105.64648,-99.69141 -2.78907,14.3125 -71.16992,365.14062 124.81055,0 23.04492,-119.37109 43.925776,0 c 29.780569,0 55.131204,-2.96625 76.431641,-9.54687 l 0.0625,-0.0195 0.0625,-0.0195 C 1.1781386,94.92167 20.010872,83.95213 35.651243,69.0147 l 0.0293,-0.0273 0.02734,-0.0254 C 49.987967,55.20437 61.12506,38.93988 68.787961,20.65341 l 0.01172,-0.0273 0.0098,-0.0274 c 7.643691,-18.41434 11.492187,-37.98045 11.492187,-58.17382 0,-33.42661 -12.798296,-62.75381 -37.203125,-82.41602 -24.257058,-19.8177 -56.934123,-28.84375 -95.716797,-28.84375 l -161.837886,0 z"
|
||||
style="color:#000000;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:35.39651489;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
id="path4257" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 20 KiB |
Loading…
x
Reference in New Issue
Block a user