rawTherapee/rtengine/imageio.h

188 lines
5.7 KiB
C++

/*
* This file is part of RawTherapee.
*
* Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.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 _IMAGEIO_
#define _IMAGEIO_
#define IMIO_SUCCESS 0
#define IMIO_CANNOTREADFILE 1
#define IMIO_INVALIDHEADER 2
#define IMIO_HEADERERROR 3
#define IMIO_READERROR 4
#define IMIO_VARIANTNOTSUPPORTED 5
#define IMIO_FILETYPENOTSUPPORTED 6
#define IMIO_CANNOTWRITEFILE 7
#include "rtengine.h"
#include <glibmm.h>
#include "procparams.h"
#include <libiptcdata/iptc-data.h>
#include "../rtexif/rtexif.h"
#include "imagedimensions.h"
#include "iimage.h"
#include "colortemp.h"
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
{
protected:
ProgressListener* pl;
cmsHPROFILE embProfile;
char* profileData;
int profileLength;
char* loadedProfileData;
bool loadedProfileDataJpg;
int loadedProfileLength;
procparams::ExifPairs exifChange;
IptcData* iptc;
const rtexif::TagDirectory* exifRoot;
MyMutex imutex;
IIOSampleFormat sampleFormat;
IIOSampleArrangement sampleArrangement;
private:
void deleteLoadedProfileData( )
{
if(loadedProfileData) {
if(loadedProfileDataJpg) {
free(loadedProfileData);
} else {
delete[] loadedProfileData;
}
}
loadedProfileData = nullptr;
}
public:
static Glib::ustring errorMsg[6];
ImageIO () : pl (nullptr), embProfile(nullptr), profileData(nullptr), profileLength(0), loadedProfileData(nullptr), loadedProfileDataJpg(false),
loadedProfileLength(0), iptc(nullptr), exifRoot (nullptr), sampleFormat(IIOSF_UNKNOWN),
sampleArrangement(IIOSA_UNKNOWN) {}
virtual ~ImageIO ();
void setProgressListener (ProgressListener* l)
{
pl = l;
}
void setSampleFormat(IIOSampleFormat sFormat)
{
sampleFormat = sFormat;
}
IIOSampleFormat getSampleFormat()
{
return sampleFormat;
}
void setSampleArrangement(IIOSampleArrangement sArrangement)
{
sampleArrangement = sArrangement;
}
IIOSampleArrangement getSampleArrangement()
{
return sampleArrangement;
}
virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const PreviewProps & pp, bool first, procparams::ToneCurveParams hrp)
{
printf("getStdImage NULL!\n");
}
virtual int getBPS () = 0;
virtual void getScanline (int row, unsigned char* buffer, int bps) {}
virtual void setScanline (int row, unsigned char* buffer, int bps, float minValue[3] = nullptr, float maxValue[3] = nullptr) {}
virtual bool readImage (Glib::ustring &fname, FILE *fh)
{
return false;
};
virtual bool writeImage (Glib::ustring &fname, FILE *fh)
{
return false;
};
int load (Glib::ustring fname);
int save (Glib::ustring fname);
int loadPNG (Glib::ustring fname);
int loadJPEG (Glib::ustring fname);
int loadTIFF (Glib::ustring fname);
static int getPNGSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement);
static int getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement);
int loadJPEGFromMemory (const char* buffer, int bufsize);
int loadPPMFromMemory(const char* buffer, int width, int height, bool swap, int bps);
int savePNG (Glib::ustring fname, int compression = -1, volatile int bps = -1);
int saveJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3);
int saveTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false);
cmsHPROFILE getEmbeddedProfile ()
{
return embProfile;
}
void getEmbeddedProfileData (int& length, unsigned char*& pdata)
{
length = loadedProfileLength;
pdata = (unsigned char*)loadedProfileData;
}
void setMetadata (const rtexif::TagDirectory* eroot);
void setMetadata (const rtexif::TagDirectory* eroot, const rtengine::procparams::ExifPairs& exif, const rtengine::procparams::IPTCPairs& iptcc);
void setOutputProfile (char* pdata, int plen);
MyMutex& mutex ()
{
return imutex;
}
};
}
#endif