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:
Hombre57 2017-08-08 23:42:05 +02:00
parent b183a0b3c7
commit f23be9345c
45 changed files with 1529 additions and 265 deletions

View File

@ -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

View File

@ -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

View File

@ -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 =

View File

@ -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 );

View File

@ -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())

View File

@ -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;

View File

@ -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 );

View File

@ -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;
}
}

View File

@ -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
View 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

View File

@ -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
{

View File

@ -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;
}

View File

@ -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();

View File

@ -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();
};

View File

@ -22,7 +22,7 @@
#include <ctime>
#include "dcraw.h"
#include "imageio.h"
#include "imageformat.h"
#include "noncopyable.h"
namespace rtengine

View File

@ -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);

View File

@ -166,9 +166,9 @@ public:
return ri->get_rotateDegree();
}
ImageData* getImageData ()
FrameData* getImageData (int frameNum)
{
return idata;
return idata->getFrameData (frameNum);
}
ImageMatrices* getImageMatrices ()
{

View File

@ -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

View File

@ -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. */

View File

@ -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;

View File

@ -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 ()
{

View File

@ -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";

View File

@ -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)

View File

@ -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.

View File

@ -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},

View File

@ -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);

View File

@ -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;

View File

@ -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);
}

View File

@ -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");
}

View File

@ -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());
}
}
}
}

View File

@ -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 ();

View File

@ -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)

View File

@ -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);

View File

@ -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 ();

View File

@ -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 ();

View File

@ -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)

View File

@ -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;

View File

@ -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) {

View File

@ -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 ();

View File

@ -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();

View File

@ -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 ();

View File

@ -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;

View File

@ -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

View 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

View 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