/**************************************************************************** ** ** Definition of TQImage and TQImageIO classes ** ** Created : 950207 ** ** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. ** ** This file is part of the kernel module of the TQt GUI Toolkit. ** ** This file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free ** Software Foundation and appearing in the files LICENSE.GPL2 ** and LICENSE.GPL3 included in the packaging of this file. ** Alternatively you may (at your option) use any later version ** of the GNU General Public License if such license has been ** publicly approved by Trolltech ASA (or its successors, if any) ** and the KDE Free TQt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** This file may be used under the terms of the Q Public License as ** defined by Trolltech ASA and appearing in the file LICENSE.TQPL ** included in the packaging of this file. Licensees holding valid TQt ** Commercial licenses may use this file in accordance with the TQt ** Commercial License Agreement provided with the Software. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted ** herein. ** **********************************************************************/ #ifndef TQIMAGE_H #define TQIMAGE_H #include "tqtglobaldefines.h" #ifndef TQT_H #include "tqpixmap.h" #include "tqstrlist.h" #include "tqstringlist.h" #endif // TQT_H #ifdef USE_QT4 #include #include #include #include #endif // USE_QT4 #ifdef USE_QT4 #ifndef TQT_NO_IMAGE_TEXT class TQ_EXPORT TQImageTextKeyLang : public QImageTextKeyLang, virtual public TQt { public: TQImageTextKeyLang(const char* k, const char* l) : QImageTextKeyLang(k, l) { } TQImageTextKeyLang() : QImageTextKeyLang() { } bool operator< (const TQImageTextKeyLang& other) const { return key < other.key || (key==other.key && lang < other.lang); } bool operator== (const TQImageTextKeyLang& other) const { return key==other.key && lang==other.lang; } // Interoperability static const TQImageTextKeyLang& convertFromQImageTextKeyLang( QImageTextKeyLang& qbr ); }; // Interoperability inline static const TQImageTextKeyLang& convertFromQImageTextKeyLang( const QImageTextKeyLang& qbr ) { return (*static_cast(&qbr)); } #endif //TQT_NO_IMAGE_TEXT class TQ_EXPORT TQImage : public QImage, virtual public TQt { public: enum Endian { IgnoreEndian, BigEndian, LittleEndian }; QImage::Format formatFor(int depth, Endian bitOrder); TQImage() : QImage() { jumptable=NULL; } TQImage( int width, int height, int depth, int numColors=0, Endian bitOrder=IgnoreEndian ) : QImage( width, height, formatFor(depth, bitOrder) ) { jumptable=NULL; setColorCount(numColors); } TQImage( const QSize&ts, int depth, int numColors=0, Endian bitOrder=IgnoreEndian ) : QImage( ts, formatFor(depth, bitOrder) ) { jumptable=NULL; setColorCount(numColors); } #ifndef TQT_NO_IMAGEIO TQImage( const QString &fileName, const char* format=0 ) : QImage( fileName, format ) { jumptable=NULL; } TQImage( const char * const xpm[] ) : QImage( xpm ) { jumptable=NULL; } // TQImage( const QByteArray &data ) : QImage( data ) {} #endif TQImage( uchar* data, int w, int h, int depth, QRgb* colortable, int numColors, Endian bitOrder ) : QImage( data, w, h, formatFor(depth, bitOrder) ) { jumptable=NULL; setColorCount(numColors); if (colortable) { setColorCount(numColors); for (int i = 0; i < numColors; ++i) { setColor(i, colortable[i]); } } } // ~TQImage(); #ifndef TQT_NO_IMAGE_HEURISTIC_MASK TQImage createHeuristicMask( bool clipTight=TRUE ) const; #endif Endian bitOrder() const { Format f = format(); return f == Format_Mono ? BigEndian : (f == Format_MonoLSB ? LittleEndian : IgnoreEndian); } #ifdef TQ_WS_TQWS TQImage( uchar* data, int w, int h, int depth, int pbl, QRgb* colortable, int numColors, Endian bitOrder ) : QImage( data, w, h, depth, pbl, colortable, numColors, bitOrder ) { jumptable=NULL; } #endif TQImage( const QImage &im ) : QImage( im ) { jumptable=NULL; } // static TQStrList inputFormats() { return TQT_TQSTRLIST_OBJECT(QImageReader::supportedImageFormats()); } // static TQStrList outputFormats() { return TQT_TQSTRLIST_OBJECT(QImageWriter::supportedImageFormats()); } inline TQImage smoothScale(int w, int h, AspectRatioMode mode = IgnoreAspectRatio) const { return scaled(QSize(w, h), (Qt::AspectRatioMode)mode, Qt::SmoothTransformation); } inline TQImage smoothScale(const QSize &s, AspectRatioMode mode = IgnoreAspectRatio) const { return scaled(s, (Qt::AspectRatioMode)mode, Qt::SmoothTransformation); } inline TQImage swapRGB() const { return rgbSwapped(); } inline TQImage mirror(bool horizontally = false, bool vertically = true) const { return mirrored(horizontally, vertically); } #ifndef TQT_NO_IMAGE_TRANSFORMATION inline TQImage scale( int w, int h, ScaleMode mode=ScaleFree ) const { return scaled(QSize(w, h), (Qt::AspectRatioMode)mode, Qt::FastTransformation); } inline TQImage scale( const TQSize& s, ScaleMode mode=ScaleFree ) const { return scaled(s, (Qt::AspectRatioMode)mode, Qt::FastTransformation); } inline TQImage scaleWidth( int w ) const { return scaledToWidth(w, Qt::FastTransformation); } inline TQImage scaleHeight( int h ) const { return scaledToHeight(h, Qt::FastTransformation); } inline TQImage xForm(const QMatrix &matrix) const { return transformed(QTransform(matrix)); } #endif TQImage convertDepth(int, Qt::ImageConversionFlags flags = Qt::AutoColor) const; TQImage convertDepthWithPalette(int, QRgb* p, int pc, Qt::ImageConversionFlags flags = Qt::AutoColor) const; TQImage convertBitOrder(Endian) const; inline void tqinvertPixels( bool invertAlpha = TRUE ) { if (invertAlpha) invertPixels(InvertRgba); else invertPixels(InvertRgb); } bool hasAlphaBuffer() const; void setAlphaBuffer(bool); static inline Endian systemByteOrder() { return QSysInfo::ByteOrder == QSysInfo::BigEndian ? BigEndian : LittleEndian; } static Endian systemBitOrder(); uchar **jumpTable(); const uchar * const *jumpTable() const; bool create( int width, int height, int depth, int numColors=0, Endian bitOrder=IgnoreEndian ); bool create( const TQSize&, int depth, int numColors=0, Endian bitOrder=IgnoreEndian ); inline void reset() { *this = QImage(); } inline TQValueList tqtextList() const { QList qs = textList(); TQValueList qn; for (int i = 0; i < qs.size(); ++i) qn.append(convertFromQImageTextKeyLang(qs.at(i))); return qn; } inline TQRgb *tqcolorTable() const { return colorTable().data(); } #ifndef TQT_NO_IMAGEIO static const char* imageFormat( const TQString &fileName ); static TQStrList inputFormats(); static TQStrList outputFormats(); #ifndef TQT_NO_STRINGLIST static TQStringList inputFormatList(); static TQStringList outputFormatList(); #endif bool load( const TQString &fileName, const char* format=0 ); bool loadFromData( const uchar *buf, uint len, const char *format=0 ); bool loadFromData( TQByteArray data, const char* format=0 ); bool save( const TQString &fileName, const char* format, int quality=-1 ) const; bool save( QIODevice * tqdevice, const char* format, int quality=-1 ) const; #endif //TQT_NO_IMAGEIO private: mutable uchar **jumptable; void reinit(); void freeBits(); #ifndef TQT_NO_IMAGEIO bool doImageIO( TQImageIO* io, int quality ) const; #endif public: // Interoperability static const TQImage& convertFromQImage( QImage& qi ); using QImage::operator=; }; // Interoperability inline static const TQImage& convertFromQImage( const QImage& qi ) { return (*static_cast(&qi)); } #if 0 typedef void (*image_io_handler)( TQImageIO * ); // image IO handler class TQ_EXPORT TQImageIO : public QImageReader, public QImageWriter, virtual public TQt { public: TQImageIO() : QImageReader(), QImageWriter() {} TQImageIO( QIODevice *ioDevice, const char *format ) : QImageReader( ioDevice, format ), QImageWriter( ioDevice, format ) {} TQImageIO( const QString &fileName, const char* format ) : QImageReader( fileName, format ), QImageWriter( fileName, format ) {} static TQStrList inputFormats() { return TQT_TQSTRLIST_OBJECT(QImageReader::supportedImageFormats()); } static TQStrList outputFormats() { return TQT_TQSTRLIST_OBJECT(QImageWriter::supportedImageFormats()); } inline void setImage( const QImage &qi ) { internalImage = qi; } inline bool write() { return QImageWriter::write( internalImage ); } inline bool read() { if (QImageReader::read().isNull() == true) return false; else return true; } inline int quality() const { return QImageWriter::quality(); } inline const TQImage &image() { return TQT_TQIMAGE_OBJECT(QImageReader::read()); } inline static void defineIOHandler( const char *format, const char *header, const char *flags, image_io_handler read_image, image_io_handler write_image ) { // [FIXME] Is this now automatic in Qt4?? TQ_UNUSED(format); TQ_UNUSED(header); TQ_UNUSED(flags); TQ_UNUSED(read_image); TQ_UNUSED(write_image); printf("[WARNING] static void defineIOHandler( const char *format, const char *header, const char *flags, image_io_handler read_image, image_io_handler write_image ) unimplemented\n\r"); } void setqStatus( int ); inline TQIODevice *ioDevice() const { if (QImageReader::device() != 0) return static_cast(QImageReader::device()); else return static_cast(QImageWriter::device()); } inline const char *format() const { if (QImageReader::format() != "") return QImageReader::format(); else return QImageWriter::format(); } inline TQString fileName() const { if (QImageReader::fileName() != "") return QImageReader::fileName(); else return QImageWriter::fileName(); } inline const char *parameters() const { printf("[WARNING] const char *parameters() const unimplemented\n\r"); return 0; } inline void setFileName( const QString &qs ) { QImageReader::setFileName(qs); QImageWriter::setFileName(qs); } inline void setQuality( int ql ) { QImageReader::setQuality(ql); QImageWriter::setQuality(ql); } inline void setIODevice( TQIODevice *tqiod ) { QImageReader::setDevice(tqiod); QImageWriter::setDevice(tqiod); } inline void setParameters( const char * ) { printf("[WARNING] void setParameters(const char *) unimplemented\n\r"); } inline void setFormat( const char * format ) { QImageReader::setFormat(format); QImageWriter::setFormat(format); } private: QImage internalImage; }; #else class TQIODevice; typedef void (*image_io_handler)( TQImageIO * ); // image IO handler struct TQImageIOData; class TQ_EXPORT TQImageIO { public: TQImageIO(); TQImageIO( QIODevice *ioDevice, const char *format ); TQImageIO( const TQString &fileName, const char* format ); ~TQImageIO(); const TQImage &image() const { return im; } int status() const { return iostat; } const char *format() const { return frmt; } TQIODevice *ioDevice() const { return iodev; } TQString fileName() const { return fname; } int quality() const; TQString description() const { return descr; } const char *parameters() const; float gamma() const; void setImage( const QImage & ); void setqStatus( int ); void setFormat( const char * ); void setIODevice( TQIODevice * ); void setFileName( const TQString & ); void setQuality( int ); void setDescription( const TQString & ); void setParameters( const char * ); void setGamma( float ); bool read(); bool write(); static const char* imageFormat( const TQString &fileName ); static const char *imageFormat( TQIODevice * ); static TQStrList inputFormats(); static TQStrList outputFormats(); static void defineIOHandler( const char *format, const char *header, const char *flags, image_io_handler read_image, image_io_handler write_image ); private: void init(); TQImage im; // image int iostat; // IO status TQCString frmt; // image format TQIODevice *iodev; // IO tqdevice TQString fname; // file name char *params; // image parameters //### change to TQImageIOData *d in 3.0 TQString descr; // image description TQImageIOData *d; private: // Disabled copy constructor and operator= #if defined(TQ_DISABLE_COPY) TQImageIO( const TQImageIO & ); TQImageIO &operator=( const TQImageIO & ); #endif }; #endif #else // USE_QT4 class TQImageDataMisc; // internal #ifndef TQT_NO_IMAGE_TEXT class TQ_EXPORT TQImageTextKeyLang { public: TQImageTextKeyLang(const char* k, const char* l) : key(k), lang(l) { } TQImageTextKeyLang() { } TQCString key; TQCString lang; bool operator< (const TQImageTextKeyLang& other) const { return key < other.key || (key==other.key && lang < other.lang); } bool operator== (const TQImageTextKeyLang& other) const { return key==other.key && lang==other.lang; } }; #endif //TQT_NO_IMAGE_TEXT class TQ_EXPORT TQImage { public: enum Endian { IgnoreEndian, BigEndian, LittleEndian }; TQImage(); TQImage( int width, int height, int depth, int numColors=0, Endian bitOrder=IgnoreEndian ); TQImage( const TQSize&, int depth, int numColors=0, Endian bitOrder=IgnoreEndian ); #ifndef TQT_NO_IMAGEIO TQImage( const TQString &fileName, const char* format=0 ); TQImage( const char * const xpm[] ); TQImage( const TQByteArray &data ); #endif TQImage( uchar* data, int w, int h, int depth, TQRgb* colortable, int numColors, Endian bitOrder ); #ifdef TQ_WS_TQWS TQImage( uchar* data, int w, int h, int depth, int pbl, TQRgb* colortable, int numColors, Endian bitOrder ); #endif TQImage( const TQImage & ); ~TQImage(); TQImage &operator=( const TQImage & ); TQImage &operator=( const TQPixmap & ); bool operator==( const TQImage & ) const; bool operator!=( const TQImage & ) const; void detach(); TQImage copy() const; TQImage copy(int x, int y, int w, int h, int conversion_flags=0) const; TQImage copy(const TQRect&) const; #ifndef TQT_NO_MIME static TQImage fromMimeSource( const TQString& abs_name ); #endif bool isNull() const { return data->bits == 0; } int width() const { return data->w; } int height() const { return data->h; } TQSize size() const { return TQSize(data->w,data->h); } TQRect rect() const { return TQRect(0,0,data->w,data->h); } int depth() const { return data->d; } int numColors() const { return data->ncols; } Endian bitOrder() const { return (Endian) data->bitordr; } TQRgb color( int i ) const; void setColor( int i, TQRgb c ); void setNumColors( int ); bool hasAlphaBuffer() const; void setAlphaBuffer( bool ); bool allGray() const; bool isGrayscale() const; uchar *bits() const; uchar *scanLine( int ) const; uchar **jumpTable() const; TQRgb *colorTable() const; int numBytes() const; int bytesPerLine() const; #ifdef TQ_WS_TQWS TQGfx * graphicsContext(); #endif bool create( int width, int height, int depth, int numColors=0, Endian bitOrder=IgnoreEndian ); bool create( const TQSize&, int depth, int numColors=0, Endian bitOrder=IgnoreEndian ); void reset(); void fill( uint pixel ); void invertPixels( bool invertAlpha = TRUE ); TQImage convertDepth( int ) const; #ifndef TQT_NO_IMAGE_TRUECOLOR TQImage convertDepthWithPalette( int, TQRgb* p, int pc, int cf=0 ) const; #endif TQImage convertDepth( int, int conversion_flags ) const; TQImage convertBitOrder( Endian ) const; enum ScaleMode { ScaleFree, ScaleMin, ScaleMax }; #ifndef TQT_NO_IMAGE_SMOOTHSCALE TQImage smoothScale( int w, int h, ScaleMode mode=ScaleFree ) const; TQImage smoothScale( const TQSize& s, ScaleMode mode=ScaleFree ) const; #endif #ifndef TQT_NO_IMAGE_TRANSFORMATION TQImage scale( int w, int h, ScaleMode mode=ScaleFree ) const; TQImage scale( const TQSize& s, ScaleMode mode=ScaleFree ) const; TQImage scaleWidth( int w ) const; TQImage scaleHeight( int h ) const; TQImage xForm( const TQWMatrix &matrix ) const; #endif #ifndef TQT_NO_IMAGE_DITHER_TO_1 TQImage createAlphaMask( int conversion_flags=0 ) const; #endif #ifndef TQT_NO_IMAGE_HEURISTIC_MASK TQImage createHeuristicMask( bool clipTight=TRUE ) const; #endif #ifndef TQT_NO_IMAGE_MIRROR TQImage mirror() const; TQImage mirror(bool horizontally, bool vertically) const; #endif TQImage swapRGB() const; static Endian systemBitOrder(); static Endian systemByteOrder(); #ifndef TQT_NO_IMAGEIO static const char* imageFormat( const TQString &fileName ); static TQStrList inputFormats(); static TQStrList outputFormats(); #ifndef TQT_NO_STRINGLIST static TQStringList inputFormatList(); static TQStringList outputFormatList(); #endif bool load( const TQString &fileName, const char* format=0 ); bool loadFromData( const uchar *buf, uint len, const char *format=0 ); bool loadFromData( TQByteArray data, const char* format=0 ); bool save( const TQString &fileName, const char* format, int quality=-1 ) const; bool save( TQIODevice * tqdevice, const char* format, int quality=-1 ) const; #endif //TQT_NO_IMAGEIO bool valid( int x, int y ) const; int pixelIndex( int x, int y ) const; TQRgb pixel( int x, int y ) const; void setPixel( int x, int y, uint index_or_rgb ); // Auxiliary data int dotsPerMeterX() const; int dotsPerMeterY() const; void setDotsPerMeterX(int); void setDotsPerMeterY(int); TQPoint offset() const; void setOffset(const TQPoint&); #ifndef TQT_NO_IMAGE_TEXT TQValueList textList() const; TQStringList textLanguages() const; TQStringList textKeys() const; TQString text(const char* key, const char* lang=0) const; TQString text(const TQImageTextKeyLang&) const; void setText(const char* key, const char* lang, const TQString&); #endif private: void init(); void reinit(); void freeBits(); static void warningIndexRange( const char *, int ); struct TQImageData : public TQShared { // internal image data int w; // image width int h; // image height int d; // image depth int ncols; // number of colors int nbytes; // number of bytes data int bitordr; // bit order (1 bit depth) TQRgb *ctbl; // color table uchar **bits; // image data bool alpha; // alpha buffer int dpmx; // dots per meter X (or 0) int dpmy; // dots per meter Y (or 0) TQPoint offset; // offset in pixels #ifndef TQT_NO_IMAGE_TEXT TQImageDataMisc* misc; // less common stuff #endif bool ctbl_mine; // this allocated ctbl } *data; #ifndef TQT_NO_IMAGE_TEXT TQImageDataMisc& misc() const; #endif #ifndef TQT_NO_IMAGEIO bool doImageIO( TQImageIO* io, int quality ) const; #endif friend TQ_EXPORT void bitBlt( TQImage* dst, int dx, int dy, const TQImage* src, int sx, int sy, int sw, int sh, int conversion_flags ); }; // TQImage stream functions #if !defined(TQT_NO_DATASTREAM) && !defined(TQT_NO_IMAGEIO) TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQImage & ); TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQImage & ); #endif #ifndef TQT_NO_IMAGEIO class TQIODevice; typedef void (*image_io_handler)( TQImageIO * ); // image IO handler struct TQImageIOData; class TQ_EXPORT TQImageIO { public: TQImageIO(); TQImageIO( TQIODevice *ioDevice, const char *format ); TQImageIO( const TQString &fileName, const char* format ); ~TQImageIO(); const TQImage &image() const { return im; } int status() const { return iostat; } const char *format() const { return frmt; } TQIODevice *ioDevice() const { return iodev; } TQString fileName() const { return fname; } int quality() const; TQString description() const { return descr; } const char *parameters() const; float gamma() const; void setImage( const TQImage & ); void setqStatus( int ); void setFormat( const char * ); void setIODevice( TQIODevice * ); void setFileName( const TQString & ); void setQuality( int ); void setDescription( const TQString & ); void setParameters( const char * ); void setGamma( float ); bool read(); bool write(); static const char* imageFormat( const TQString &fileName ); static const char *imageFormat( TQIODevice * ); static TQStrList inputFormats(); static TQStrList outputFormats(); static void defineIOHandler( const char *format, const char *header, const char *flags, image_io_handler read_image, image_io_handler write_image ); private: void init(); TQImage im; // image int iostat; // IO status TQCString frmt; // image format TQIODevice *iodev; // IO tqdevice TQString fname; // file name char *params; // image parameters //### change to TQImageIOData *d in 3.0 TQString descr; // image description TQImageIOData *d; private: // Disabled copy constructor and operator= #if defined(TQ_DISABLE_COPY) TQImageIO( const TQImageIO & ); TQImageIO &operator=( const TQImageIO & ); #endif }; #endif //TQT_NO_IMAGEIO TQ_EXPORT void bitBlt( TQImage* dst, int dx, int dy, const TQImage* src, int sx=0, int sy=0, int sw=-1, int sh=-1, int conversion_flags=0 ); /***************************************************************************** TQImage member functions *****************************************************************************/ inline bool TQImage::hasAlphaBuffer() const { return data->alpha; } inline uchar *TQImage::bits() const { return data->bits ? data->bits[0] : 0; } inline uchar **TQImage::jumpTable() const { return data->bits; } inline TQRgb *TQImage::colorTable() const { return data->ctbl; } inline int TQImage::numBytes() const { return data->nbytes; } inline int TQImage::bytesPerLine() const { return data->h ? data->nbytes/data->h : 0; } inline TQImage TQImage::copy(const TQRect& r) const { return copy(r.x(), r.y(), r.width(), r.height()); } inline TQRgb TQImage::color( int i ) const { #if defined(TQT_CHECK_RANGE) if ( i >= data->ncols ) warningIndexRange( "color", i ); #endif return data->ctbl ? data->ctbl[i] : (TQRgb)-1; } inline void TQImage::setColor( int i, TQRgb c ) { #if defined(TQT_CHECK_RANGE) if ( i >= data->ncols ) warningIndexRange( "setColor", i ); #endif if ( data->ctbl ) data->ctbl[i] = c; } inline uchar *TQImage::scanLine( int i ) const { #if defined(TQT_CHECK_RANGE) if ( i >= data->h ) warningIndexRange( "scanLine", i ); #endif return data->bits ? data->bits[i] : 0; } inline int TQImage::dotsPerMeterX() const { return data->dpmx; } inline int TQImage::dotsPerMeterY() const { return data->dpmy; } inline TQPoint TQImage::offset() const { return data->offset; } #endif // USE_QT4 #endif // TQIMAGE_H