00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00028
00029 #ifndef PGF_PGFIMAGE_H
00030 #define PGF_PGFIMAGE_H
00031
00032 #include "PGFstream.h"
00033
00035
00036 enum ProgressMode { PM_Relative, PM_Absolute };
00037
00039
00040 class CDecoder;
00041 class CEncoder;
00042 class CWaveletTransform;
00043
00057 class CPGFImage {
00058 public:
00059
00062 CPGFImage();
00063
00066 virtual ~CPGFImage();
00067
00071 virtual void Close();
00072
00076 virtual void Destroy();
00077
00083 void Open(CPGFStream* stream) THROW_;
00084
00087 bool IsOpen() const { return m_decoder != NULL; }
00088
00101 void Read(int level = 0, CallbackPtr cb = NULL, void *data = NULL) THROW_;
00102
00103 #ifdef __PGFROISUPPORT__
00113 void Read(PGFRect& rect, int level = 0, CallbackPtr cb = NULL, void *data = NULL) THROW_;
00114 #endif
00115
00121 void ReadPreview() THROW_ { Read(Levels() - 1); }
00122
00128 void Reconstruct(int level = 0) THROW_;
00129
00147 void GetBitmap(int pitch, UINT8* buff, BYTE bpp, int channelMap[] = NULL, CallbackPtr cb = NULL, void *data = NULL) const THROW_;
00148
00164 void GetYUV(int pitch, DataT* buff, BYTE bpp, int channelMap[] = NULL, CallbackPtr cb = NULL, void *data = NULL) const THROW_;
00165
00182 void ImportBitmap(int pitch, UINT8 *buff, BYTE bpp, int channelMap[] = NULL, CallbackPtr cb = NULL, void *data = NULL) THROW_;
00183
00199 void ImportYUV(int pitch, DataT *buff, BYTE bpp, int channelMap[] = NULL, CallbackPtr cb = NULL, void *data = NULL) THROW_;
00200
00214 void Write(CPGFStream* stream, UINT32* nWrittenBytes = NULL, CallbackPtr cb = NULL, void *data = NULL) THROW_;
00215
00223 UINT32 WriteHeader(CPGFStream* stream) THROW_;
00224
00235 UINT32 WriteImage(CPGFStream* stream, CallbackPtr cb = NULL, void *data = NULL) THROW_;
00236
00237 #ifdef __PGFROISUPPORT__
00253 UINT32 Write(int level, CallbackPtr cb = NULL, void *data = NULL) THROW_;
00254 #endif
00255
00260 void ConfigureEncoder(bool useOMP = true, bool favorSpeedOverSize = false) { m_useOMPinEncoder = useOMP; m_favorSpeedOverSize = favorSpeedOverSize; }
00261
00266 void ConfigureDecoder(bool useOMP = true, bool skipUserData = false) { m_useOMPinDecoder = useOMP; m_skipUserData = skipUserData; }
00267
00270 void ResetStreamPos() THROW_;
00271
00276 void SetChannel(DataT* channel, int c = 0) { ASSERT(c >= 0 && c < MaxChannels); m_channel[c] = channel; }
00277
00286 void SetHeader(const PGFHeader& header, BYTE flags = 0, UINT8* userData = 0, UINT32 userDataLength = 0) THROW_;
00287
00292 void SetMaxValue(UINT32 maxValue);
00293
00300 void SetProgressMode(ProgressMode pm) { m_progressMode = pm; }
00301
00307 void SetRefreshCallback(RefreshCB callback, void* arg) { m_cb = callback; m_cbArg = arg; }
00308
00315 void SetColorTable(UINT32 iFirstColor, UINT32 nColors, const RGBQUAD* prgbColors) THROW_;
00316
00321 DataT* GetChannel(int c = 0) { ASSERT(c >= 0 && c < MaxChannels); return m_channel[c]; }
00322
00329 void GetColorTable(UINT32 iFirstColor, UINT32 nColors, RGBQUAD* prgbColors) const THROW_;
00330
00332
00334 const RGBQUAD* GetColorTable() const { return m_postHeader.clut; }
00335
00339 const PGFHeader* GetHeader() const { return &m_header; }
00340
00345 UINT32 GetMaxValue() const { return (1 << m_header.usedBitsPerChannel) - 1; }
00346
00350 UINT64 GetUserDataPos() const { return m_userDataPos; }
00351
00357 const UINT8* GetUserData(UINT32& size) const;
00358
00363 UINT32 GetEncodedHeaderLength() const;
00364
00370 UINT32 GetEncodedLevelLength(int level) const { ASSERT(level >= 0 && level < m_header.nLevels); return m_levelLength[m_header.nLevels - level - 1]; }
00371
00379 UINT32 ReadEncodedHeader(UINT8* target, UINT32 targetLen) const THROW_;
00380
00390 UINT32 ReadEncodedData(int level, UINT8* target, UINT32 targetLen) const THROW_;
00391
00397 UINT32 ChannelWidth(int c = 0) const { ASSERT(c >= 0 && c < MaxChannels); return m_width[c]; }
00398
00404 UINT32 ChannelHeight(int c = 0) const { ASSERT(c >= 0 && c < MaxChannels); return m_height[c]; }
00405
00409 BYTE ChannelDepth() const { return CurrentChannelDepth(m_preHeader.version); }
00410
00416 UINT32 Width(int level = 0) const { ASSERT(level >= 0); return LevelWidth(m_header.width, level); }
00417
00423 UINT32 Height(int level = 0) const { ASSERT(level >= 0); return LevelHeight(m_header.height, level); }
00424
00430 BYTE Level() const { return (BYTE)m_currentLevel; }
00431
00435 BYTE Levels() const { return m_header.nLevels; }
00436
00441 BYTE Quality() const { return m_header.quality; }
00442
00447 BYTE Channels() const { return m_header.channels; }
00448
00454 BYTE Mode() const { return m_header.mode; }
00455
00460 BYTE BPP() const { return m_header.bpp; }
00461
00465 bool ROIisSupported() const { return (m_preHeader.version & PGFROI) == PGFROI; }
00466
00471 BYTE UsedBitsPerChannel() const;
00472
00476 BYTE Version() const { return CurrentVersion(m_preHeader.version); }
00477
00478
00479
00484 static bool ImportIsSupported(BYTE mode);
00485
00491 static UINT32 LevelWidth(UINT32 width, int level) { ASSERT(level >= 0); UINT32 w = (width >> level); return ((w << level) == width) ? w : w + 1; }
00492
00498 static UINT32 LevelHeight(UINT32 height, int level) { ASSERT(level >= 0); UINT32 h = (height >> level); return ((h << level) == height) ? h : h + 1; }
00499
00503 static BYTE CurrentVersion(BYTE version = PGFVersion);
00504
00508 static BYTE CurrentChannelDepth(BYTE version = PGFVersion) { return (version & PGF32) ? 32 : 16; }
00509
00510 protected:
00511 CWaveletTransform* m_wtChannel[MaxChannels];
00512 DataT* m_channel[MaxChannels];
00513 CDecoder* m_decoder;
00514 CEncoder* m_encoder;
00515 UINT32* m_levelLength;
00516 UINT32 m_width[MaxChannels];
00517 UINT32 m_height[MaxChannels];
00518 PGFPreHeader m_preHeader;
00519 PGFHeader m_header;
00520 PGFPostHeader m_postHeader;
00521 UINT64 m_userDataPos;
00522 int m_currentLevel;
00523 BYTE m_quant;
00524 bool m_downsample;
00525 bool m_favorSpeedOverSize;
00526 bool m_useOMPinEncoder;
00527 bool m_useOMPinDecoder;
00528 bool m_skipUserData;
00529 #ifdef __PGFROISUPPORT__
00530 bool m_streamReinitialized;
00531 PGFRect m_roi;
00532 #endif
00533
00534 private:
00535 RefreshCB m_cb;
00536 void *m_cbArg;
00537 double m_percent;
00538 ProgressMode m_progressMode;
00539
00540 void ComputeLevels();
00541 bool CompleteHeader();
00542 void RgbToYuv(int pitch, UINT8* rgbBuff, BYTE bpp, int channelMap[], CallbackPtr cb, void *data) THROW_;
00543 void Downsample(int nChannel);
00544 UINT32 UpdatePostHeaderSize() THROW_;
00545 void WriteLevel() THROW_;
00546
00547 #ifdef __PGFROISUPPORT__
00548 void SetROI(PGFRect rect);
00549 #endif
00550
00551 UINT8 Clamp4(DataT v) const {
00552 if (v & 0xFFFFFFF0) return (v < 0) ? (UINT8)0: (UINT8)15; else return (UINT8)v;
00553 }
00554 UINT16 Clamp6(DataT v) const {
00555 if (v & 0xFFFFFFC0) return (v < 0) ? (UINT16)0: (UINT16)63; else return (UINT16)v;
00556 }
00557 UINT8 Clamp8(DataT v) const {
00558
00559 if (v & 0xFFFFFF00) return (v < 0) ? (UINT8)0 : (UINT8)255; else return (UINT8)v;
00560 }
00561 UINT16 Clamp16(DataT v) const {
00562 if (v & 0xFFFF0000) return (v < 0) ? (UINT16)0: (UINT16)65535; else return (UINT16)v;
00563 }
00564 UINT32 Clamp31(DataT v) const {
00565 return (v < 0) ? 0 : (UINT32)v;
00566 }
00567 };
00568
00569 #endif //PGF_PGFIMAGE_H