rgb.h
00001 // kimgio module for SGI images 00002 // 00003 // Copyright (C) 2004 Melchior FRANZ <mfranz@kde.org> 00004 // 00005 // This program is free software; you can redistribute it and/or 00006 // modify it under the terms of the Lesser GNU General Public License as 00007 // published by the Free Software Foundation; either version 2 of the 00008 // License, or (at your option) any later version. 00009 00010 00011 #ifndef KIMG_RGB_H 00012 #define KIMG_RGB_H 00013 00014 #include <tqmap.h> 00015 #include <tqptrvector.h> 00016 00017 00018 class TQImage; 00019 class TQImageIO; 00020 00021 extern "C" { 00022 void kimgio_rgb_read(TQImageIO *); 00023 void kimgio_rgb_write(TQImageIO *); 00024 } 00025 00026 00027 class RLEData : public TQMemArray<uchar> { 00028 public: 00029 RLEData() {} 00030 RLEData(const uchar *d, uint l, uint o) : m_offset(o) { duplicate(d, l); } 00031 bool operator<(const RLEData&) const; 00032 void write(TQDataStream& s); 00033 void print(TQString) const; // TODO remove 00034 uint offset() { return m_offset; } 00035 private: 00036 uint m_offset; 00037 }; 00038 00039 00040 class RLEMap : public TQMap<RLEData, uint> { 00041 public: 00042 RLEMap() : m_counter(0), m_offset(0) {} 00043 uint insert(const uchar *d, uint l); 00044 TQPtrVector<RLEData> vector(); 00045 void setBaseOffset(uint o) { m_offset = o; } 00046 private: 00047 uint m_counter; 00048 uint m_offset; 00049 }; 00050 00051 00052 class SGIImage { 00053 public: 00054 SGIImage(TQImageIO *); 00055 ~SGIImage(); 00056 00057 bool readImage(TQImage&); 00058 bool writeImage(TQImage&); 00059 00060 private: 00061 enum { NORMAL, DITHERED, SCREEN, COLORMAP }; // colormap 00062 TQImageIO *m_io; 00063 TQIODevice *m_dev; 00064 TQDataStream m_stream; 00065 00066 TQ_UINT8 m_rle; 00067 TQ_UINT8 m_bpc; 00068 TQ_UINT16 m_dim; 00069 TQ_UINT16 m_xsize; 00070 TQ_UINT16 m_ysize; 00071 TQ_UINT16 m_zsize; 00072 TQ_UINT32 m_pixmin; 00073 TQ_UINT32 m_pixmax; 00074 char m_imagename[80]; 00075 TQ_UINT32 m_colormap; 00076 00077 TQ_UINT32 *m_starttab; 00078 TQ_UINT32 *m_lengthtab; 00079 TQByteArray m_data; 00080 TQByteArray::Iterator m_pos; 00081 RLEMap m_rlemap; 00082 TQPtrVector<RLEData> m_rlevector; 00083 uint m_numrows; 00084 00085 bool readData(TQImage&); 00086 bool getRow(uchar *dest); 00087 00088 void writeHeader(); 00089 void writeRle(); 00090 void writeVerbatim(const TQImage&); 00091 bool scanData(const TQImage&); 00092 uint compact(uchar *, uchar *); 00093 uchar intensity(uchar); 00094 }; 00095 00096 #endif 00097