summaryrefslogtreecommitdiff
path: root/libopie2/opiemm/opieexif.h
authoralwin <alwin>2004-11-01 19:52:25 (UTC)
committer alwin <alwin>2004-11-01 19:52:25 (UTC)
commit2dc92f4bfe9e81edc2b0b24ecacf3bc44b344984 (patch) (side-by-side diff)
treeb1d5661ea64931b6eeb2030ceb22532cef699a75 /libopie2/opiemm/opieexif.h
parent5a41dcd5901badbd2e258b0a916fb012b6351eeb (diff)
downloadopie-2dc92f4bfe9e81edc2b0b24ecacf3bc44b344984.zip
opie-2dc92f4bfe9e81edc2b0b24ecacf3bc44b344984.tar.gz
opie-2dc92f4bfe9e81edc2b0b24ecacf3bc44b344984.tar.bz2
exif class added (taken from opie-eye_slave and more c++ like reworked)
it is used in oimageview while loading jpegs checking BEFORE loading if the image should be scaled loaded. ToDo: documentation of the interface, remove it from opie-eye_slave (it should use of course the library version)
Diffstat (limited to 'libopie2/opiemm/opieexif.h') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiemm/opieexif.h139
1 files changed, 139 insertions, 0 deletions
diff --git a/libopie2/opiemm/opieexif.h b/libopie2/opiemm/opieexif.h
new file mode 100644
index 0000000..efaed71
--- a/dev/null
+++ b/libopie2/opiemm/opieexif.h
@@ -0,0 +1,139 @@
+#ifndef _OPIE_EXIF_H
+#define _OPIE_EXIF_H
+
+#include <qt.h>
+#include <qstring.h>
+#include <qimage.h>
+#include <qfile.h>
+
+#include <time.h>
+
+namespace Opie { namespace MM {
+
+#ifndef uchar
+typedef unsigned char uchar;
+#endif
+
+//#define MAX_SECTIONS 20
+//#define PSEUDO_IMAGE_MARKER 0x123; // Extra value.
+
+//! Class for reading exif data from images
+/*!
+ * This class is mostly used inside OImageScrollView for testing jpegs headers for a faster
+ * loading and scaling. It is taken from libexif and converted into an C++ structure.
+ *
+ * \see OImageScrollView
+ * \since 1.2
+ */
+class ExifData {
+public:
+ enum ReadMode_t {
+ READ_EXIF = 1,
+ READ_IMAGE = 2,
+ READ_ALL = 3
+ };
+
+ //--------------------------------------------------------------------------
+ // This structure is used to store jpeg file sections in memory.
+ struct Section_t {
+ uchar * Data;
+ int Type;
+ unsigned Size;
+ };
+
+ struct TagTable_t {
+ unsigned short Tag;
+ const char*const Desc;
+ };
+
+private:
+ static const int MAX_SECTIONS=20;
+ static const unsigned int PSEUDO_IMAGE_MARKER=0x123;
+ Section_t Sections[MAX_SECTIONS];
+
+ QString CameraMake;
+ QString CameraModel;
+ QString DateTime;
+ int Orientation;
+ int Height, Width;
+ int ExifImageLength, ExifImageWidth;
+ int IsColor;
+ int Process;
+ int FlashUsed;
+ float FocalLength;
+ float ExposureTime;
+ float ApertureFNumber;
+ float Distance;
+ int Whitebalance;
+ int MeteringMode;
+ float CCDWidth;
+ float ExposureBias;
+ int ExposureProgram;
+ int ISOequivalent;
+ int CompressionLevel;
+ QString UserComment;
+ QString Comment;
+ QImage Thumbnail;
+
+ unsigned char * LastExifRefd;
+ int ExifSettingsLength;
+ double FocalplaneXRes;
+ double FocalplaneUnits;
+ int MotorolaOrder;
+ int SectionsRead;
+
+ int ReadJpegSections (QFile & infile, ReadMode_t ReadMode);
+ void DiscardData(void);
+ int Get16u(void * Short);
+ int Get32s(void * Long);
+ unsigned Get32u(void * Long);
+ double ConvertAnyFormat(void * ValuePtr, int Format);
+ void ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBase, unsigned ExifLength);
+ void process_COM (const uchar * Data, int length);
+ void process_SOFn (const uchar * Data, int marker);
+ int Get16m(const void * Short);
+ void process_EXIF(unsigned char * CharBuf, unsigned int length);
+ int Exif2tm(struct ::tm * timeptr, char * ExifTime);
+
+public:
+ //! Contructor for initialising
+ ExifData();
+ //! destructor
+ virtual ~ExifData();
+ //! scan a given file
+ /*!
+ * try to scan the EXIF data of a image file
+ * \param aFile the file to scan
+ * \return true if success, otherwise false
+ */
+ bool scan(const QString &aFile);
+ QString getCameraMake() { return CameraMake; }
+ QString getCameraModel() { return CameraModel; }
+ QString getDateTime() { return DateTime; }
+ int getOrientation() { return Orientation; }
+ int getHeight() { return Height; }
+ int getWidth() { return Width; }
+ int getIsColor() { return IsColor; }
+ int getProcess() { return Process; }
+ int getFlashUsed() { return FlashUsed; }
+ float getFocalLength() { return FocalLength; }
+ float getExposureTime() { return ExposureTime; }
+ float getApertureFNumber() { return ApertureFNumber; }
+ float getDistance() { return Distance; }
+ int getWhitebalance() { return Whitebalance; }
+ int getMeteringMode() { return MeteringMode; }
+ float getCCDWidth() { return CCDWidth; }
+ float getExposureBias() { return ExposureBias; }
+ int getExposureProgram() { return ExposureProgram; }
+ int getISOequivalent() { return ISOequivalent; }
+ int getCompressionLevel() { return CompressionLevel; }
+ QString getUserComment() { return UserComment; }
+ QString getComment() { return Comment; }
+ QImage getThumbnail();
+ bool isThumbnailSane();
+ bool isNullThumbnail() { return !isThumbnailSane(); }
+};
+
+}
+}
+#endif