diff -u -3 -d -p -r1.4 -r1.4.2.1 --- exr.cpp 22 Nov 2004 03:48:27 -0000 1.4 +++ exr.cpp 19 Apr 2005 10:48:00 -0000 1.4.2.1 @@ -136,6 +136,8 @@ KDE_EXPORT void kimgio_exr_read( QImageI file.readPixels (dw.min.y, dw.max.y); QImage image(width, height, 32, 0, QImage::BigEndian); + if( image.isNull()) + return; // somehow copy pixels into image for ( int y=0; y < height; y++ ) { diff -u -3 -d -p -r1.4 -r1.4.2.1 --- g3r.cpp 22 Nov 2004 03:48:27 -0000 1.4 +++ g3r.cpp 18 Apr 2005 13:08:44 -0000 1.4.2.1 @@ -28,7 +28,7 @@ KDE_EXPORT void kimgio_g3_read( QImageIO QImage image(width, height, 1, 0, QImage::BigEndian); - if (scanlength != image.bytesPerLine()) + if (image.isNull() || scanlength != image.bytesPerLine()) { TIFFClose(tiff); return; diff -u -3 -d -p -r1.14 -r1.14.2.1 --- jp2.cpp 22 Nov 2004 03:48:27 -0000 1.14 +++ jp2.cpp 19 Apr 2005 10:48:00 -0000 1.14.2.1 @@ -157,8 +157,9 @@ namespace { void draw_view_gray( gs_t& gs, QImage& qti ) { - qti.create( jas_image_width( gs.image ), jas_image_height( gs.image ), - 8, 256 ); + if( !qti.create( jas_image_width( gs.image ), jas_image_height( gs.image ), + 8, 256 )) + return; for( int i = 0; i < 256; ++i ) qti.setColor( i, qRgb( i, i, i ) ); diff -u -3 -d -p -r1.12 -r1.12.2.2 --- pcx.cpp 22 Nov 2004 03:48:27 -0000 1.12 +++ pcx.cpp 19 Apr 2005 10:48:00 -0000 1.12.2.2 @@ -1,5 +1,5 @@ /* This file is part of the KDE project - Copyright (C) 2002-2003 Nadeem Hasan + Copyright (C) 2002-2005 Nadeem Hasan This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -44,6 +44,11 @@ static QDataStream &operator>>( QDataStr s >> ph.HScreenSize; s >> ph.VScreenSize; + // Skip the rest of the header + Q_UINT8 byte; + while ( s.device()->at() < 128 ) + s >> byte; + return s; } @@ -85,25 +90,22 @@ static QDataStream &operator<<( QDataStr return s; } -static PCXHEADER header; -static QImage img; -static Q_UINT16 w, h; - -void PCXHEADER::reset() +PCXHEADER::PCXHEADER() { + // Initialize all data to zero QByteArray dummy( 128 ); dummy.fill( 0 ); QDataStream s( dummy, IO_ReadOnly ); s >> *this; } -static void readLine( QDataStream &s, QByteArray &buf ) +static void readLine( QDataStream &s, QByteArray &buf, const PCXHEADER &header ) { Q_UINT32 i=0; Q_UINT32 size = buf.size(); Q_UINT8 byte, count; - if ( header.Encoding == 1 ) + if ( header.isCompressed() ) { // Uncompress the image data while ( i < size ) @@ -130,13 +132,14 @@ static void readLine( QDataStream &s, QB } } -static void readImage1( QDataStream &s ) +static void readImage1( QImage &img, QDataStream &s, const PCXHEADER &header ) { QByteArray buf( header.BytesPerLine ); - img.create( w, h, 1, 2, QImage::BigEndian ); + if(!img.create( header.width(), header.height(), 1, 2, QImage::BigEndian )) + return; - for ( int y=0; y> ( x%8 ) ) ) pixbuf[ x ] += ( 1 << i ); } uchar *p = img.scanLine( y ); - - for ( int x=0; x> flag; - kdDebug() << "Flag: " << flag << endl; + kdDebug( 399 ) << "Palette Flag: " << flag << endl; - if ( flag == 12 && header.Version == 5 ) + if ( flag == 12 && ( header.Version == 5 || header.Version == 2 ) ) { // Read the palette Q_UINT8 r, g, b; @@ -230,15 +235,16 @@ static void readImage8( QDataStream &s ) } } -static void readImage24( QDataStream &s ) +static void readImage24( QImage &img, QDataStream &s, const PCXHEADER &header ) { QByteArray r_buf( header.BytesPerLine ); QByteArray g_buf( header.BytesPerLine ); QByteArray b_buf( header.BytesPerLine ); - img.create( w, h, 32 ); + if(!img.create( header.width(), header.height(), 32 )) + return; - for ( int y=0; y> header; if ( header.Manufacturer != 10 || s.atEnd()) @@ -276,10 +283,8 @@ KDE_EXPORT void kimgio_pcx_read( QImageI return; } - w = ( header.XMax-header.XMin ) + 1; - h = ( header.YMax-header.YMin ) + 1; - - img.reset(); + int w = header.width(); + int h = header.height(); kdDebug( 399 ) << "Manufacturer: " << header.Manufacturer << endl; kdDebug( 399 ) << "Version: " << header.Version << endl; @@ -288,30 +293,27 @@ KDE_EXPORT void kimgio_pcx_read( QImageI kdDebug( 399 ) << "Width: " << w << endl; kdDebug( 399 ) << "Height: " << h << endl; kdDebug( 399 ) << "Window: " << header.XMin << "," << header.XMax << "," - << header.YMin << "," << header.YMax << endl; + << header.YMin << "," << header.YMax << endl; kdDebug( 399 ) << "BytesPerLine: " << header.BytesPerLine << endl; kdDebug( 399 ) << "NPlanes: " << header.NPlanes << endl; - // Skip the rest of the header - Q_UINT8 byte; - while ( s.device()->at() < 128 ) - s >> byte; + QImage img; if ( header.Bpp == 1 && header.NPlanes == 1 ) { - readImage1( s ); + readImage1( img, s, header ); } else if ( header.Bpp == 1 && header.NPlanes == 4 ) { - readImage4( s ); + readImage4( img, s, header ); } else if ( header.Bpp == 8 && header.NPlanes == 1 ) { - readImage8( s ); + readImage8( img, s, header ); } else if ( header.Bpp == 8 && header.NPlanes == 3 ) { - readImage24( s ); + readImage24( img, s, header ); } kdDebug( 399 ) << "Image Bytes: " << img.numBytes() << endl; @@ -359,7 +361,7 @@ static void writeLine( QDataStream &s, Q } } -static void writeImage1( QDataStream &s ) +static void writeImage1( QImage &img, QDataStream &s, PCXHEADER &header ) { img = img.convertBitOrder( QImage::BigEndian ); @@ -367,29 +369,27 @@ static void writeImage1( QDataStream &s header.NPlanes = 1; header.BytesPerLine = img.bytesPerLine(); - header.ColorMap.setColor( 0, qRgb( 0, 0, 0 ) ); - header.ColorMap.setColor( 1, qRgb( 255, 255, 255 ) ); - s << header; QByteArray buf( header.BytesPerLine ); - for ( int y=0; yioDevice() ); s.setByteOrder( QDataStream::LittleEndian ); - img = io->image(); + QImage img = io->image(); - w = img.width(); - h = img.height(); + int w = img.width(); + int h = img.height(); kdDebug( 399 ) << "Width: " << w << endl; kdDebug( 399 ) << "Height: " << h << endl; @@ -495,6 +495,8 @@ KDE_EXPORT void kimgio_pcx_write( QImage kdDebug( 399 ) << "BytesPerLine: " << img.bytesPerLine() << endl; kdDebug( 399 ) << "Num Colors: " << img.numColors() << endl; + PCXHEADER header; + header.Manufacturer = 10; header.Version = 5; header.Encoding = 1; @@ -509,19 +511,19 @@ KDE_EXPORT void kimgio_pcx_write( QImage if ( img.depth() == 1 ) { - writeImage1( s ); + writeImage1( img, s, header ); } else if ( img.depth() == 8 && img.numColors() <= 16 ) { - writeImage4( s ); + writeImage4( img, s, header ); } else if ( img.depth() == 8 ) { - writeImage8( s ); + writeImage8( img, s, header ); } else if ( img.depth() == 32 ) { - writeImage24( s ); + writeImage24( img, s, header ); } io->setStatus( 0 ); Index: pcx.h =================================================================== RCS file: /home/kde/kdelibs/kimgio/pcx.h,v retrieving revision 1.4 retrieving revision 1.4.8.1 diff -u -3 -d -p -r1.4 -r1.4.8.1 --- pcx.h 4 Jan 2003 00:48:25 -0000 1.4 +++ pcx.h 19 Apr 2005 10:48:00 -0000 1.4.8.1 @@ -49,7 +49,7 @@ class Palette rgb[ i ] = RGB( color ); } - QRgb color( int i ) + QRgb color( int i ) const { return qRgb( rgb[ i ].r, rgb[ i ].g, rgb[ i ].b ); } @@ -60,12 +60,11 @@ class Palette class PCXHEADER { public: - PCXHEADER() - { - reset(); - } + PCXHEADER(); - void reset(); + inline int width() const { return ( XMax-XMin ) + 1; } + inline int height() const { return ( YMax-YMin ) + 1; } + inline bool isCompressed() const { return ( Encoding==1 ); } Q_UINT8 Manufacturer; // Constant Flag, 10 = ZSoft .pcx Q_UINT8 Version; // Version information· @@ -99,7 +98,7 @@ class PCXHEADER // found only in PB IV/IV Plus Q_UINT16 VScreenSize; // Vertical screen size in pixels. New field // found only in PB IV/IV Plus -}; +} KDE_PACKED; #endif // PCX_H diff -u -3 -d -p -r1.1 -r1.1.2.1 --- psd.cpp 16 Dec 2004 09:59:07 -0000 1.1 +++ psd.cpp 19 Apr 2005 10:48:00 -0000 1.1.2.1 @@ -66,6 +66,19 @@ namespace { // Private. s >> header.color_mode; return s; } + static bool seekBy(QDataStream& s, unsigned int bytes) + { + char buf[4096]; + while (bytes) { + unsigned int num= QMIN(bytes,sizeof(buf)); + unsigned int l = num; + s.readRawBytes(buf, l); + if(l != num) + return false; + bytes -= num; + } + return true; + } // Check that the header is a valid PSD. static bool IsValid( const PSDHeader & header ) @@ -149,10 +162,8 @@ namespace { // Private. if( compression ) { // Skip row lengths. - ushort w; - for(uint i = 0; i < header.height * header.channel_count; i++) { - s >> w; - } + if(!seekBy(s, header.height*header.channel_count*sizeof(ushort))) + return false; // Read RLE data. for(uint channel = 0; channel < channel_num; channel++) { @@ -162,6 +173,8 @@ namespace { // Private. uint count = 0; while( count < pixel_count ) { uchar c; + if(s.atEnd()) + return false; s >> c; uint len = c; @@ -169,6 +182,9 @@ namespace { // Private. // Copy next len+1 bytes literally. len++; count += len; + if ( count > pixel_count ) + return false; + while( len != 0 ) { s >> *ptr; ptr += 4; @@ -181,6 +197,8 @@ namespace { // Private. len ^= 0xFF; len += 2; count += len; + if(s.atEnd() || count > pixel_count) + return false; uchar val; s >> val; while( len != 0 ) { diff -u -3 -d -p -r1.31 -r1.31.2.1 --- rgb.cpp 10 Jan 2005 19:54:19 -0000 1.31 +++ rgb.cpp 19 Apr 2005 10:48:00 -0000 1.31.2.1 @@ -87,7 +87,9 @@ bool SGIImage::getRow(uchar *dest) int n, i; if (!m_rle) { for (i = 0; i < m_xsize; i++) { - *dest++ = uchar(*m_pos); + if(m_pos >= m_data.end()) + return false; + dest[i] = uchar(*m_pos); m_pos += m_bpc; } return true; @@ -120,7 +122,7 @@ bool SGIImage::readData(QImage& img) { QRgb *c; Q_UINT32 *start = m_starttab; - QCString lguard(m_xsize); + QByteArray lguard(m_xsize); uchar *line = (uchar *)lguard.data(); unsigned x, y; @@ -128,7 +130,7 @@ bool SGIImage::readData(QImage& img) m_pos = m_data.begin(); for (y = 0; y < m_ysize; y++) { - c = reinterpret_cast(img.scanLine(m_ysize - y - 1)); + c = (QRgb *) img.scanLine(m_ysize - y - 1); if (m_rle) m_pos = m_data.begin() + *start++; if (!getRow(line)) @@ -166,11 +168,11 @@ bool SGIImage::readData(QImage& img) } for (y = 0; y < m_ysize; y++) { - c = reinterpret_cast(img.scanLine(m_ysize - y - 1)); if (m_rle) m_pos = m_data.begin() + *start++; if (!getRow(line)) return false; + c = (QRgb*) img.scanLine(m_ysize - y - 1); for (x = 0; x < m_xsize; x++, c++) *c = qRgba(qRed(*c), qGreen(*c), qBlue(*c), line[x]); } diff -u -3 -d -p -r1.14 -r1.14.2.1 --- tiffr.cpp 22 Nov 2004 03:52:18 -0000 1.14 +++ tiffr.cpp 19 Apr 2005 10:48:00 -0000 1.14.2.1 @@ -84,6 +84,10 @@ KDE_EXPORT void kimgio_tiff_read( QImage return; QImage image( width, height, 32 ); + if( image.isNull()) { + TIFFClose( tiff ); + return; + } data = (uint32 *)image.bits(); //Sven: changed to %ld for 64bit machines diff -u -3 -d -p -r1.3 -r1.3.2.1 --- xcf.cpp 22 Nov 2004 03:48:27 -0000 1.3 +++ xcf.cpp 19 Apr 2005 10:48:00 -0000 1.3.2.1 @@ -234,10 +234,10 @@ bool XCFImageFormat::loadImageProperties property.readBytes(tag, size); Q_UINT32 flags; - char* data; + char* data=0; property >> flags >> data; - if (strcmp(tag, "gimp-comment") == 0) + if (tag && strncmp(tag, "gimp-comment", strlen("gimp-comment")) == 0) xcf_image.image.setText("Comment", 0, data); delete[] tag; @@ -257,6 +257,9 @@ bool XCFImageFormat::loadImageProperties case PROP_COLORMAP: property >> xcf_image.num_colors; + if(xcf_image.num_colors < 0 || xcf_image.num_colors > 65535) + return false; + xcf_image.palette.reserve(xcf_image.num_colors); for (int i = 0; i < xcf_image.num_colors; i++) { @@ -307,6 +310,9 @@ bool XCFImageFormat::loadProperty(QDataS return false; } + if(size > 65535 || size < 4) + return false; + size = 3 * (size - 4) + 4; data = new char[size]; @@ -336,19 +342,21 @@ bool XCFImageFormat::loadProperty(QDataS } size = 0; - } else - xcf_io.readBytes(data, size); + } else { + xcf_io >> size; + if(size >256000) + return false; + data = new char[size]; + xcf_io.readRawBytes(data, size); + } if (xcf_io.device()->status() != IO_Ok) { kdDebug(399) << "XCF: read failure on property " << type << " data, size " << size << endl; return false; } - if (size != 0) { - bytes.resize(size); - for (uint i = 0; i < size; i++) - bytes[i] = data[i]; - delete[] data; + if (size != 0 && data) { + bytes.assign(data,size); } return true; @@ -401,7 +409,8 @@ bool XCFImageFormat::loadLayer(QDataStre // Allocate the individual tile QImages based on the size and type // of this layer. - composeTiles(xcf_image); + if( !composeTiles(xcf_image)) + return false; xcf_io.device()->at(layer.hierarchy_offset); // As tiles are loaded, they are copied into the layers tiles by @@ -425,7 +434,8 @@ bool XCFImageFormat::loadLayer(QDataStre // of the QImage. if (!xcf_image.initialized) { - initializeImage(xcf_image); + if( !initializeImage(xcf_image)) + return false; copyLayerToImage(xcf_image); xcf_image.initialized = true; } else @@ -516,7 +526,7 @@ bool XCFImageFormat::loadLayerProperties * QImage structures for each of them. * \param xcf_image contains the current layer. */ -void XCFImageFormat::composeTiles(XCFImage& xcf_image) +bool XCFImageFormat::composeTiles(XCFImage& xcf_image) { Layer& layer(xcf_image.layer); @@ -556,48 +566,67 @@ void XCFImageFormat::composeTiles(XCFIma switch (layer.type) { case RGB_GIMAGE: layer.image_tiles[j][i] = QImage(tile_width, tile_height, 32, 0); + if( layer.image_tiles[j][i].isNull()) + return false; layer.image_tiles[j][i].setAlphaBuffer(false); break; case RGBA_GIMAGE: layer.image_tiles[j][i] = QImage(tile_width, tile_height, 32, 0); + if( layer.image_tiles[j][i].isNull()) + return false; layer.image_tiles[j][i].setAlphaBuffer(true); break; case GRAY_GIMAGE: layer.image_tiles[j][i] = QImage(tile_width, tile_height, 8, 256); + if( layer.image_tiles[j][i].isNull()) + return false; setGrayPalette(layer.image_tiles[j][i]); break; case GRAYA_GIMAGE: layer.image_tiles[j][i] = QImage(tile_width, tile_height, 8, 256); + if( layer.image_tiles[j][i].isNull()) + return false; setGrayPalette(layer.image_tiles[j][i]); layer.alpha_tiles[j][i] = QImage( tile_width, tile_height, 8, 256); + if( layer.alpha_tiles[j][i].isNull()) + return false; setGrayPalette(layer.alpha_tiles[j][i]); break; case INDEXED_GIMAGE: layer.image_tiles[j][i] = QImage(tile_width, tile_height, 8, xcf_image.num_colors); + if( layer.image_tiles[j][i].isNull()) + return false; setPalette(xcf_image, layer.image_tiles[j][i]); break; case INDEXEDA_GIMAGE: layer.image_tiles[j][i] = QImage(tile_width, tile_height,8, xcf_image.num_colors); + if( layer.image_tiles[j][i].isNull()) + return false; setPalette(xcf_image, layer.image_tiles[j][i]); layer.alpha_tiles[j][i] = QImage(tile_width, tile_height, 8, 256); + if( layer.alpha_tiles[j][i].isNull()) + return false; setGrayPalette(layer.alpha_tiles[j][i]); } if (layer.mask_offset != 0) { layer.mask_tiles[j][i] = QImage(tile_width, tile_height, 8, 256); + if( layer.mask_tiles[j][i].isNull()) + return false; setGrayPalette(layer.mask_tiles[j][i]); } } } + return true; } @@ -1072,7 +1101,7 @@ void XCFImageFormat::assignMaskBytes(Lay * For indexed images, translucency is an all or nothing effect. * \param xcf_image contains image info and bottom-most layer. */ -void XCFImageFormat::initializeImage(XCFImage& xcf_image) +bool XCFImageFormat::initializeImage(XCFImage& xcf_image) { // (Aliases to make the code look a little better.) Layer& layer(xcf_image.layer); @@ -1082,12 +1111,16 @@ void XCFImageFormat::initializeImage(XCF case RGB_GIMAGE: if (layer.opacity == OPAQUE_OPACITY) { image.create( xcf_image.width, xcf_image.height, 32); + if( image.isNull()) + return false; image.fill(qRgb(255, 255, 255)); break; } // else, fall through to 32-bit representation case RGBA_GIMAGE: image.create(xcf_image.width, xcf_image.height, 32); + if( image.isNull()) + return false; image.fill(qRgba(255, 255, 255, 0)); // Turning this on prevents fill() from affecting the alpha channel, // by the way. @@ -1097,6 +1130,8 @@ void XCFImageFormat::initializeImage(XCF case GRAY_GIMAGE: if (layer.opacity == OPAQUE_OPACITY) { image.create(xcf_image.width, xcf_image.height, 8, 256); + if( image.isNull()) + return false; setGrayPalette(image); image.fill(255); break; @@ -1104,6 +1139,8 @@ void XCFImageFormat::initializeImage(XCF case GRAYA_GIMAGE: image.create(xcf_image.width, xcf_image.height, 32); + if( image.isNull()) + return false; image.fill(qRgba(255, 255, 255, 0)); image.setAlphaBuffer(true); break; @@ -1125,12 +1162,16 @@ void XCFImageFormat::initializeImage(XCF image.create(xcf_image.width, xcf_image.height, 1, xcf_image.num_colors, QImage::LittleEndian); + if( image.isNull()) + return false; image.fill(0); setPalette(xcf_image, image); } else if (xcf_image.num_colors <= 256) { image.create(xcf_image.width, xcf_image.height, 8, xcf_image.num_colors, QImage::LittleEndian); + if( image.isNull()) + return false; image.fill(0); setPalette(xcf_image, image); } @@ -1147,6 +1188,8 @@ void XCFImageFormat::initializeImage(XCF image.create(xcf_image.width, xcf_image.height, 1, xcf_image.num_colors, QImage::LittleEndian); + if( image.isNull()) + return false; image.fill(0); setPalette(xcf_image, image); image.setAlphaBuffer(true); @@ -1160,6 +1203,8 @@ void XCFImageFormat::initializeImage(XCF xcf_image.palette[0] = qRgba(255, 255, 255, 0); image.create( xcf_image.width, xcf_image.height, 8, xcf_image.num_colors); + if( image.isNull()) + return false; image.fill(0); setPalette(xcf_image, image); image.setAlphaBuffer(true); @@ -1168,6 +1213,8 @@ void XCFImageFormat::initializeImage(XCF // true color. (There is no equivalent PNG representation output // from The GIMP as of v1.2.) image.create(xcf_image.width, xcf_image.height, 32); + if( image.isNull()) + return false; image.fill(qRgba(255, 255, 255, 0)); image.setAlphaBuffer(true); } @@ -1176,6 +1223,7 @@ void XCFImageFormat::initializeImage(XCF image.setDotsPerMeterX((int)(xcf_image.x_resolution * INCHESPERMETER)); image.setDotsPerMeterY((int)(xcf_image.y_resolution * INCHESPERMETER)); + return true; } Index: xcf.h =================================================================== RCS file: /home/kde/kdelibs/kimgio/xcf.h,v retrieving revision 1.1 retrieving revision 1.1.2.1 diff -u -3 -d -p -r1.1 -r1.1.2.1 --- xcf.h 13 Aug 2004 18:31:44 -0000 1.1 +++ xcf.h 19 Apr 2005 10:48:00 -0000 1.1.2.1 @@ -176,7 +176,7 @@ private: bool loadProperty(QDataStream& xcf_io, PropType& type, QByteArray& bytes); bool loadLayer(QDataStream& xcf_io, XCFImage& xcf_image); bool loadLayerProperties(QDataStream& xcf_io, Layer& layer); - void composeTiles(XCFImage& xcf_image); + bool composeTiles(XCFImage& xcf_image); void setGrayPalette(QImage& image); void setPalette(XCFImage& xcf_image, QImage& image); static void assignImageBytes(Layer& layer, uint i, uint j); @@ -185,7 +185,7 @@ private: static void assignMaskBytes(Layer& layer, uint i, uint j); bool loadMask(QDataStream& xcf_io, Layer& layer); bool loadChannelProperties(QDataStream& xcf_io, Layer& layer); - void initializeImage(XCFImage& xcf_image); + bool initializeImage(XCFImage& xcf_image); bool loadTileRLE(QDataStream& xcf_io, uchar* tile, int size, int data_length, Q_INT32 bpp); static void copyLayerToImage(XCFImage& xcf_image); diff -u -3 -d -p -r1.12 -r1.12.2.1 --- xview.cpp 22 Nov 2004 03:52:18 -0000 1.12 +++ xview.cpp 19 Apr 2005 10:48:00 -0000 1.12.2.1 @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -15,6 +16,9 @@ #define BUFSIZE 1024 +static const int b_255_3[]= {0,85,170,255}, // index*255/3 + rg_255_7[]={0,36,72,109,145,182,218,255}; // index *255/7 + KDE_EXPORT void kimgio_xv_read( QImageIO *_imageio ) { int x=-1; @@ -50,10 +54,14 @@ KDE_EXPORT void kimgio_xv_read( QImageIO sscanf(str, "%d %d %d", &x, &y, &maxval); if (maxval != 255) return; + int blocksize = x*y; + if(x < 0 || y < 0 || blocksize < x || blocksize < y) + return; // now follows a binary block of x*y bytes. - int blocksize = x*y; - char *block = new char[ blocksize ]; + char *block = (char*) malloc(blocksize); + if(!block) + return; if (iodev->readBlock(block, blocksize) != blocksize ) { @@ -62,6 +70,10 @@ KDE_EXPORT void kimgio_xv_read( QImageIO // Create the image QImage image( x, y, 8, maxval + 1, QImage::BigEndian ); + if( image.isNull()) { + free(block); + return; + } // how do the color handling? they are absolute 24bpp // or at least can be calculated as such. @@ -69,29 +81,9 @@ KDE_EXPORT void kimgio_xv_read( QImageIO for ( int j = 0; j < 256; j++ ) { -// ----------- OLIVER EIDEN -// That is the old-code ! -/* r = ((int) ((j >> 5) & 0x07)) << 5; - g = ((int) ((j >> 2) & 0x07)) << 5; - b = ((int) ((j >> 0) & 0x03)) << 6;*/ - - -// That is the code-how xv, decode 3-3-2 pixmaps, it is slighly different, -// but yields much better visuals results -/* r = (((int) ((j >> 5) & 0x07)) *255) / 7; - g = (((int) ((j >> 2) & 0x07)) *255) / 7; - b = (((int) ((j >> 0) & 0x03)) *255) / 3;*/ - -// This is the same as xv, with multiplications/divisions replaced by indexing - -// Look-up table to avoid multiplications and divisons - static int b_255_3[]= {0,85,170,255}, // index*255/3 - rg_255_7[]={0,36,72,109,145,182,218,255}; // index *255/7 - r = rg_255_7[((j >> 5) & 0x07)]; g = rg_255_7[((j >> 2) & 0x07)]; b = b_255_3[((j >> 0) & 0x03)]; -// --------------- image.setColor( j, qRgb( r, g, b ) ); } @@ -104,7 +96,7 @@ KDE_EXPORT void kimgio_xv_read( QImageIO _imageio->setImage( image ); _imageio->setStatus( 0 ); - delete [] block; + free(block); return; }