00001 #ifndef FCAM_TIFF_H
00002 #define FCAM_TIFF_H
00003
00004 #include <string>
00005 #include <map>
00006 #include <vector>
00007
00008 #include <FCam/Image.h>
00009 #include <FCam/TagValue.h>
00010 #include <FCam/Event.h>
00011
00012 #include "TIFFTags.h"
00013
00014 namespace FCam {
00015
00016 class TiffFile;
00017 class TiffIfd;
00018 class TiffIfdEntry;
00019
00020
00021
00022 class TiffIfdEntry {
00023 public:
00024
00025
00026 TiffIfdEntry(const RawTiffIfdEntry &entry, TiffFile *parent);
00027
00028
00029 TiffIfdEntry(uint16_t tag, const TagValue &val, TiffFile *parent);
00030
00031
00032 TiffIfdEntry(uint16_t tag, TiffFile *parent=NULL);
00033
00034
00035
00036 bool valid() const;
00037
00038
00039 uint16_t tag() const;
00040
00041 const char *name() const;
00042
00043
00044
00045 const TagValue& value() const;
00046
00047
00048 bool setValue(const TagValue &);
00049
00050 bool writeDataBlock(FILE *fw);
00051
00052 bool write(FILE *fw);
00053
00054 bool operator<(const TiffIfdEntry &other) const;
00055 private:
00056 RawTiffIfdEntry entry;
00057 const TiffEntryInfo *info;
00058 TiffFile *parent;
00059
00060 TagValue parse() const;
00061
00062 mutable enum {
00063 INVALID,
00064 UNREAD,
00065 READ,
00066 WRITTEN
00067 } state;
00068
00069 mutable TagValue val;
00070 };
00071
00072
00073
00074 class TiffIfd {
00075 public:
00076 TiffIfd(TiffFile *parent);
00077 ~TiffIfd();
00078
00079
00080
00081 const TiffIfdEntry *find(uint16_t tag) const;
00082 TiffIfdEntry *find(uint16_t tag);
00083
00084
00085
00086
00087
00088 bool add(const RawTiffIfdEntry &);
00089
00090
00091
00092
00093 bool add(uint16_t tag, const TagValue &val);
00094
00095
00096
00097 bool add(const std::string &tagName, const TagValue &val);
00098
00099
00100 TiffIfd* addSubIfd();
00101
00102 void eraseSubIfds();
00103
00104
00105 TiffIfd* addExifIfd();
00106
00107 void eraseExifIfd();
00108
00109
00110 const std::vector<TiffIfd *> &subIfds();
00111
00112 TiffIfd* subIfds(int index) const;
00113
00114
00115
00116
00117 Image getImage(bool memMap = true);
00118
00119 bool setImage(Image newImg);
00120
00121
00122
00123
00124 bool write(FILE *fw, uint32_t prevIfdOffset, uint32_t *offset);
00125 private:
00126 TiffFile * const parent;
00127
00128 std::vector<TiffIfd *> _subIfds;
00129 TiffIfd *exifIfd;
00130
00131 typedef std::map<int, TiffIfdEntry> entryMap;
00132 entryMap entries;
00133
00134 enum {
00135 UNREAD,
00136 NONE,
00137 CACHED
00138 } imgState;
00139 Image imgCache;
00140
00141
00142
00143 bool writeImage(FILE *fw);
00144 };
00145
00146
00147
00148
00149
00150 class TiffFile {
00151 public:
00152
00153 TiffFile(const std::string &file);
00154 TiffFile();
00155 ~TiffFile();
00156
00157 bool readFrom(const std::string &file);
00158 bool writeTo(const std::string &file);
00159
00160 bool valid;
00161 const std::string &filename() const;
00162
00163
00164 TiffIfd *addIfd();
00165
00166 void eraseIfds();
00167
00168
00169 const std::vector<TiffIfd *> &ifds() const;
00170
00171 TiffIfd* ifds(int index);
00172
00173 Event lastEvent;
00174 private:
00175 FILE *fp;
00176 std::string _filename;
00177
00178 bool littleEndian;
00179 uint32_t offsetToIfd0;
00180
00181 std::vector<TiffIfd *> _ifds;
00182
00183 uint16_t convShort(void const *src);
00184 uint32_t convLong(void const *src);
00185 float convFloat(void const *src);
00186 double convDouble(void const *src);
00187 TiffRational convRational(void const *src);
00188
00189
00190 bool readByteArray(uint32_t offset, uint32_t count, uint8_t *data);
00191
00192
00193 bool readShortArray(uint32_t offset, uint32_t count, uint16_t *dest);
00194
00195 bool readHeader();
00196 bool readIfd(uint32_t offsetToIFD, TiffIfd *ifd, uint32_t *offsetToNextIFD=NULL);
00197 bool readSubIfds(TiffIfd *ifd);
00198
00199 void setError(std::string module, std::string description) {
00200 lastEvent.creator = NULL;
00201 lastEvent.type = Event::Error;
00202 lastEvent.data = Event::FileLoadError;
00203 lastEvent.time = Time::now();
00204 lastEvent.description = "TiffFile::"+module+":"+filename()+": "+description;
00205 }
00206
00207 friend class TiffIfd;
00208 friend class TiffIfdEntry;
00209 };
00210
00211
00212 }
00213
00214 #endif