libpgf  7.15.32
PGF - Progressive Graphics File
PGFimage.h
Go to the documentation of this file.
1 /*
2  * The Progressive Graphics File; http://www.libpgf.org
3  *
4  * $Date: 2007-02-03 13:04:21 +0100 (Sa, 03 Feb 2007) $
5  * $Revision: 280 $
6  *
7  * This file Copyright (C) 2006 xeraina GmbH, Switzerland
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22  */
23 
28 
29 #ifndef PGF_PGFIMAGE_H
30 #define PGF_PGFIMAGE_H
31 
32 #include "PGFstream.h"
33 
35 // prototypes
36 class CDecoder;
37 class CEncoder;
38 class CWaveletTransform;
39 
53 class CPGFImage {
54 public:
55 
58  CPGFImage();
59 
62  virtual ~CPGFImage();
63 
65  // Destroy internal data structures. Object state after this is the same as after CPGFImage().
66  void Destroy();
67 
73  void Open(CPGFStream* stream);
74 
77  bool IsOpen() const { return m_decoder != nullptr; }
78 
91  void Read(int level = 0, CallbackPtr cb = nullptr, void *data = nullptr);
92 
93 #ifdef __PGFROISUPPORT__
94  void Read(PGFRect& rect, int level = 0, CallbackPtr cb = nullptr, void *data = nullptr);
104 #endif
105 
111  void ReadPreview() { Read(Levels() - 1); }
112 
118  void Reconstruct(int level = 0);
119 
137  void GetBitmap(int pitch, UINT8* buff, BYTE bpp, int channelMap[] = nullptr, CallbackPtr cb = nullptr, void *data = nullptr) const; // throws IOException
138 
154  void GetYUV(int pitch, DataT* buff, BYTE bpp, int channelMap[] = nullptr, CallbackPtr cb = nullptr, void *data = nullptr) const; // throws IOException
155 
172  void ImportBitmap(int pitch, UINT8 *buff, BYTE bpp, int channelMap[] = nullptr, CallbackPtr cb = nullptr, void *data = nullptr);
173 
189  void ImportYUV(int pitch, DataT *buff, BYTE bpp, int channelMap[] = nullptr, CallbackPtr cb = nullptr, void *data = nullptr);
190 
204  void Write(CPGFStream* stream, UINT32* nWrittenBytes = nullptr, CallbackPtr cb = nullptr, void *data = nullptr);
205 
213  UINT32 WriteHeader(CPGFStream* stream);
214 
225  UINT32 WriteImage(CPGFStream* stream, CallbackPtr cb = nullptr, void *data = nullptr);
226 
227 #ifdef __PGFROISUPPORT__
228  UINT32 Write(int level, CallbackPtr cb = nullptr, void *data = nullptr);
244 #endif
245 
250  void ConfigureEncoder(bool useOMP = true, bool favorSpeedOverSize = false) { m_useOMPinEncoder = useOMP; m_favorSpeedOverSize = favorSpeedOverSize; }
251 
260  void ConfigureDecoder(bool useOMP = true, UserdataPolicy policy = UP_CacheAll, UINT32 prefixSize = 0) { ASSERT(prefixSize <= MaxUserDataSize); m_useOMPinDecoder = useOMP; m_userDataPolicy = (UP_CachePrefix) ? prefixSize : 0xFFFFFFFF - policy; }
261 
266  void ResetStreamPos(bool startOfData);
267 
272  void SetChannel(DataT* channel, int c = 0) { ASSERT(c >= 0 && c < MaxChannels); m_channel[c] = channel; }
273 
282  void SetHeader(const PGFHeader& header, BYTE flags = 0, const UINT8* userData = 0, UINT32 userDataLength = 0); // throws IOException
283 
288  void SetMaxValue(UINT32 maxValue);
289 
297 
303  void SetRefreshCallback(RefreshCB callback, void* arg) { m_cb = callback; m_cbArg = arg; }
304 
311  void SetColorTable(UINT32 iFirstColor, UINT32 nColors, const RGBQUAD* prgbColors);
312 
317  DataT* GetChannel(int c = 0) { ASSERT(c >= 0 && c < MaxChannels); return m_channel[c]; }
318 
325  void GetColorTable(UINT32 iFirstColor, UINT32 nColors, RGBQUAD* prgbColors) const;
326 
328  // Returns address of internal color table
330  const RGBQUAD* GetColorTable() const { return m_postHeader.clut; }
331 
335  const PGFHeader* GetHeader() const { return &m_header; }
336 
341  UINT32 GetMaxValue() const { return (1 << m_header.usedBitsPerChannel) - 1; }
342 
346  UINT64 GetUserDataPos() const { return m_userDataPos; }
347 
354  const UINT8* GetUserData(UINT32& cachedSize, UINT32* pTotalSize = nullptr) const;
355 
360  UINT32 GetEncodedHeaderLength() const;
361 
367  UINT32 GetEncodedLevelLength(int level) const { ASSERT(level >= 0 && level < m_header.nLevels); return m_levelLength[m_header.nLevels - level - 1]; }
368 
376  UINT32 ReadEncodedHeader(UINT8* target, UINT32 targetLen) const;
377 
387  UINT32 ReadEncodedData(int level, UINT8* target, UINT32 targetLen) const;
388 
394  UINT32 ChannelWidth(int c = 0) const { ASSERT(c >= 0 && c < MaxChannels); return m_width[c]; }
395 
401  UINT32 ChannelHeight(int c = 0) const { ASSERT(c >= 0 && c < MaxChannels); return m_height[c]; }
402 
407 
413  UINT32 Width(int level = 0) const { ASSERT(level >= 0); return LevelSizeL(m_header.width, level); }
414 
420  UINT32 Height(int level = 0) const { ASSERT(level >= 0); return LevelSizeL(m_header.height, level); }
421 
427  BYTE Level() const { return (BYTE)m_currentLevel; }
428 
432  BYTE Levels() const { return m_header.nLevels; }
433 
436  bool IsFullyRead() const { return m_currentLevel == 0; }
437 
442  BYTE Quality() const { return m_header.quality; }
443 
448  BYTE Channels() const { return m_header.channels; }
449 
455  BYTE Mode() const { return m_header.mode; }
456 
461  BYTE BPP() const { return m_header.bpp; }
462 
466  bool ROIisSupported() const { return (m_preHeader.version & PGFROI) == PGFROI; }
467 
468 #ifdef __PGFROISUPPORT__
469  PGFRect ComputeLevelROI() const;
473 #endif
474 
479  BYTE UsedBitsPerChannel() const;
480 
484  BYTE Version() const { BYTE ver = CodecMajorVersion(m_preHeader.version); return (ver <= 7) ? ver : (BYTE)m_header.version.major; }
485 
486  //class methods
487 
492  static bool ImportIsSupported(BYTE mode);
493 
499  static UINT32 LevelSizeL(UINT32 size, int level) { ASSERT(level >= 0); UINT32 d = 1 << level; return (size + d - 1) >> level; }
500 
506  static UINT32 LevelSizeH(UINT32 size, int level) { ASSERT(level >= 0); UINT32 d = 1 << (level - 1); return (size + d - 1) >> level; }
507 
512  static BYTE CodecMajorVersion(BYTE version = PGFVersion);
513 
518  static BYTE MaxChannelDepth(BYTE version = PGFVersion) { return (version & PGF32) ? 32 : 16; }
519 
520 protected:
525  UINT32* m_levelLength;
531  UINT64 m_userDataPos;
534  BYTE m_quant;
539 #ifdef __PGFROISUPPORT__
542 #endif
543 
544 private:
546  void *m_cbArg;
547  double m_percent;
549 
550  void Init();
551  void ComputeLevels();
552  bool CompleteHeader();
553  void RgbToYuv(int pitch, UINT8* rgbBuff, BYTE bpp, int channelMap[], CallbackPtr cb, void *data);
554  void Downsample(int nChannel);
555  UINT32 UpdatePostHeaderSize();
556  void WriteLevel();
557 
558 #ifdef __PGFROISUPPORT__
559  PGFRect GetAlignedROI(int c = 0) const;
560  void SetROI(PGFRect rect);
561 #endif
562 
563  UINT8 Clamp4(DataT v) const {
564  if (v & 0xFFFFFFF0) return (v < 0) ? (UINT8)0: (UINT8)15; else return (UINT8)v;
565  }
566  UINT16 Clamp6(DataT v) const {
567  if (v & 0xFFFFFFC0) return (v < 0) ? (UINT16)0: (UINT16)63; else return (UINT16)v;
568  }
569  UINT8 Clamp8(DataT v) const {
570  // needs only one test in the normal case
571  if (v & 0xFFFFFF00) return (v < 0) ? (UINT8)0 : (UINT8)255; else return (UINT8)v;
572  }
573  UINT16 Clamp16(DataT v) const {
574  if (v & 0xFFFF0000) return (v < 0) ? (UINT16)0: (UINT16)65535; else return (UINT16)v;
575  }
576  UINT32 Clamp31(DataT v) const {
577  return (v < 0) ? 0 : (UINT32)v;
578  }
579 };
580 
581 #endif //PGF_PGFIMAGE_H
void Open(CPGFStream *stream)
Definition: PGFimage.cpp:141
void SetColorTable(UINT32 iFirstColor, UINT32 nColors, const RGBQUAD *prgbColors)
Definition: PGFimage.cpp:1363
void Read(int level=0, CallbackPtr cb=nullptr, void *data=nullptr)
Definition: PGFimage.cpp:402
bool m_favorSpeedOverSize
favor encoding speed over compression ratio
Definition: PGFimage.h:536
UINT64 m_userDataPos
stream position of user data
Definition: PGFimage.h:531
bool m_useOMPinDecoder
use Open MP in decoder
Definition: PGFimage.h:538
UINT8 version
PGF version.
Definition: PGFtypes.h:115
UINT8 mode
image mode according to Adobe&#39;s image modes
Definition: PGFtypes.h:158
UINT32 ReadEncodedHeader(UINT8 *target, UINT32 targetLen) const
Definition: PGFimage.cpp:660
#define PGFVersion
current standard version
Definition: PGFtypes.h:76
void GetYUV(int pitch, DataT *buff, BYTE bpp, int channelMap[]=nullptr, CallbackPtr cb=nullptr, void *data=nullptr) const
Definition: PGFimage.cpp:2549
const UINT8 * GetUserData(UINT32 &cachedSize, UINT32 *pTotalSize=nullptr) const
Definition: PGFimage.cpp:337
UINT32 Height(int level=0) const
Definition: PGFimage.h:420
#define MaxChannels
maximum number of (color) channels
Definition: PGFtypes.h:64
Abstract stream base class.
Definition: PGFstream.h:39
BYTE UsedBitsPerChannel() const
Definition: PGFimage.cpp:755
void GetBitmap(int pitch, UINT8 *buff, BYTE bpp, int channelMap[]=nullptr, CallbackPtr cb=nullptr, void *data=nullptr) const
Definition: PGFimage.cpp:1788
UINT32 width
image width in pixels
Definition: PGFtypes.h:152
DataT * GetChannel(int c=0)
Definition: PGFimage.h:317
void(* RefreshCB)(void *p)
Definition: PGFtypes.h:267
UINT32 ReadEncodedData(int level, UINT8 *target, UINT32 targetLen) const
Definition: PGFimage.cpp:706
INT32 DataT
Definition: PGFtypes.h:262
CDecoder * m_decoder
PGF decoder.
Definition: PGFimage.h:523
UINT32 GetEncodedLevelLength(int level) const
Definition: PGFimage.h:367
void ImportYUV(int pitch, DataT *buff, BYTE bpp, int channelMap[]=nullptr, CallbackPtr cb=nullptr, void *data=nullptr)
Definition: PGFimage.cpp:2660
PGFHeader m_header
PGF file header.
Definition: PGFimage.h:529
bool m_streamReinitialized
stream has been reinitialized
Definition: PGFimage.h:540
void WriteLevel()
Definition: PGFimage.cpp:1067
bool CompleteHeader()
Definition: PGFimage.cpp:218
BYTE m_quant
quantization parameter
Definition: PGFimage.h:534
void * m_cbArg
refresh callback argument
Definition: PGFimage.h:546
DataT * m_channel[MaxChannels]
untransformed channels in YUV format
Definition: PGFimage.h:522
PGFPreHeader m_preHeader
PGF pre-header.
Definition: PGFimage.h:528
static UINT32 LevelSizeL(UINT32 size, int level)
Definition: PGFimage.h:499
PGF pre-header.
Definition: PGFtypes.h:123
UINT8 nLevels
number of FWT transforms
Definition: PGFtypes.h:154
void SetProgressMode(ProgressMode pm)
Definition: PGFimage.h:296
UINT8 usedBitsPerChannel
number of used bits per channel in 16- and 32-bit per channel modes
Definition: PGFtypes.h:159
void SetROI(PGFRect rect)
const RGBQUAD * GetColorTable() const
Definition: PGFimage.h:330
PGF wavelet transform.
PGFRect GetAlignedROI(int c=0) const
UINT32 WriteImage(CPGFStream *stream, CallbackPtr cb=nullptr, void *data=nullptr)
Definition: PGFimage.cpp:1149
PGF header.
Definition: PGFtypes.h:150
static BYTE CodecMajorVersion(BYTE version=PGFVersion)
Return major version.
Definition: PGFimage.cpp:767
UINT16 Clamp6(DataT v) const
Definition: PGFimage.h:566
BYTE Version() const
Definition: PGFimage.h:484
UINT32 GetMaxValue() const
Definition: PGFimage.h:341
ProgressMode m_progressMode
progress mode used in Read and Write; PM_Relative is default mode
Definition: PGFimage.h:548
CWaveletTransform * m_wtChannel[MaxChannels]
wavelet transformed color channels
Definition: PGFimage.h:521
UINT8 bpp
bits per pixel
Definition: PGFtypes.h:156
PGFPostHeader m_postHeader
PGF post-header.
Definition: PGFimage.h:530
UINT32 Clamp31(DataT v) const
Definition: PGFimage.h:576
void ComputeLevels()
Definition: PGFimage.cpp:853
UINT16 Clamp16(DataT v) const
Definition: PGFimage.h:573
void Init()
Definition: PGFimage.cpp:69
bool m_downsample
chrominance channels are downsampled
Definition: PGFimage.h:535
PGF decoder.
Definition: Decoder.h:46
void SetRefreshCallback(RefreshCB callback, void *arg)
Definition: PGFimage.h:303
UINT32 * m_levelLength
length of each level in bytes; first level starts immediately after this array
Definition: PGFimage.h:525
UINT32 WriteHeader(CPGFStream *stream)
Definition: PGFimage.cpp:978
UINT32 m_width[MaxChannels]
width of each channel at current level
Definition: PGFimage.h:526
CPGFImage()
Standard constructor.
Definition: PGFimage.cpp:64
Optional PGF post-header.
Definition: PGFtypes.h:168
void SetHeader(const PGFHeader &header, BYTE flags=0, const UINT8 *userData=0, UINT32 userDataLength=0)
Definition: PGFimage.cpp:893
bool ROIisSupported() const
Definition: PGFimage.h:466
BYTE Level() const
Definition: PGFimage.h:427
#define PGFROI
supports Regions Of Interest
Definition: PGFtypes.h:70
void ReadPreview()
Definition: PGFimage.h:111
bool IsOpen() const
Returns true if the PGF has been opened for reading.
Definition: PGFimage.h:77
bool m_useOMPinEncoder
use Open MP in encoder
Definition: PGFimage.h:537
UserdataPolicy
Definition: PGFtypes.h:101
virtual ~CPGFImage()
Destructor.
Definition: PGFimage.cpp:117
void Reconstruct(int level=0)
Definition: PGFimage.cpp:348
bool IsFullyRead() const
Return true if all levels have been read.
Definition: PGFimage.h:436
UINT8 Clamp8(DataT v) const
Definition: PGFimage.h:569
PGF main class.
Definition: PGFimage.h:53
void Destroy()
Definition: PGFimage.cpp:124
UINT32 ChannelHeight(int c=0) const
Definition: PGFimage.h:401
UINT8 Clamp4(DataT v) const
Definition: PGFimage.h:563
static UINT32 LevelSizeH(UINT32 size, int level)
Definition: PGFimage.h:506
BYTE Channels() const
Definition: PGFimage.h:448
BYTE ChannelDepth() const
Definition: PGFimage.h:406
UINT16 major
major version number
Definition: PGFtypes.h:140
UINT32 GetEncodedHeaderLength() const
Definition: PGFimage.cpp:648
PGF stream class.
void ConfigureDecoder(bool useOMP=true, UserdataPolicy policy=UP_CacheAll, UINT32 prefixSize=0)
Definition: PGFimage.h:260
UINT32 m_userDataPolicy
user data (metadata) policy during open
Definition: PGFimage.h:533
double m_percent
progress [0..1]
Definition: PGFimage.h:547
BYTE Mode() const
Definition: PGFimage.h:455
UINT8 channels
number of channels
Definition: PGFtypes.h:157
void RgbToYuv(int pitch, UINT8 *rgbBuff, BYTE bpp, int channelMap[], CallbackPtr cb, void *data)
Definition: PGFimage.cpp:1388
void SetChannel(DataT *channel, int c=0)
Definition: PGFimage.h:272
void ImportBitmap(int pitch, UINT8 *buff, BYTE bpp, int channelMap[]=nullptr, CallbackPtr cb=nullptr, void *data=nullptr)
Definition: PGFimage.cpp:791
void ResetStreamPos(bool startOfData)
Definition: PGFimage.cpp:682
#define PGF32
32 bit values are used -> allows at maximum 31 bits, otherwise 16 bit values are used -> allows at ma...
Definition: PGFtypes.h:69
UINT32 ChannelWidth(int c=0) const
Definition: PGFimage.h:394
BYTE BPP() const
Definition: PGFimage.h:461
void SetMaxValue(UINT32 maxValue)
Definition: PGFimage.cpp:737
Rectangle.
Definition: PGFtypes.h:222
RefreshCB m_cb
pointer to refresh callback procedure
Definition: PGFimage.h:545
static bool ImportIsSupported(BYTE mode)
Definition: PGFimage.cpp:1304
#define MaxUserDataSize
Definition: PGFtypes.h:277
CEncoder * m_encoder
PGF encoder.
Definition: PGFimage.h:524
static BYTE MaxChannelDepth(BYTE version=PGFVersion)
Definition: PGFimage.h:518
PGFVersionNumber version
codec version number: (since Version 7)
Definition: PGFtypes.h:160
UINT32 Width(int level=0) const
Definition: PGFimage.h:413
const PGFHeader * GetHeader() const
Definition: PGFimage.h:335
BYTE Levels() const
Definition: PGFimage.h:432
BYTE Quality() const
Definition: PGFimage.h:442
void Downsample(int nChannel)
Definition: PGFimage.cpp:809
int m_currentLevel
transform level of current image
Definition: PGFimage.h:532
UINT8 quality
quantization parameter: 0=lossless, 4=standard, 6=poor quality
Definition: PGFtypes.h:155
PGFRect ComputeLevelROI() const
UINT32 height
image height in pixels
Definition: PGFtypes.h:153
RGBQUAD clut[ColorTableLen]
color table for indexed color images (optional part of file header)
Definition: PGFtypes.h:169
void Write(CPGFStream *stream, UINT32 *nWrittenBytes=nullptr, CallbackPtr cb=nullptr, void *data=nullptr)
Definition: PGFimage.cpp:1220
void ConfigureEncoder(bool useOMP=true, bool favorSpeedOverSize=false)
Definition: PGFimage.h:250
UINT32 m_height[MaxChannels]
height of each channel at current level
Definition: PGFimage.h:527
UINT32 UpdatePostHeaderSize()
Definition: PGFimage.cpp:1123
PGF encoder.
Definition: Encoder.h:46
ProgressMode
Definition: PGFtypes.h:100
PGFRect m_roi
region of interest
Definition: PGFimage.h:541
UINT64 GetUserDataPos() const
Definition: PGFimage.h:346