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 <
[email protected]>
+ Copyright (C) 2002-2005 Nadeem Hasan <
[email protected]>
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<h; ++y )
+ for ( int y=0; y<header.height(); ++y )
{
if ( s.atEnd() )
{
@@ -144,10 +147,11 @@ static void readImage1( QDataStream &s )
return;
}
- readLine( s, buf );
-
- for ( int x=0; x<header.BytesPerLine; ++x )
- *( img.scanLine( y )+x ) = buf[ x ];
+ readLine( s, buf, header );
+ uchar *p = img.scanLine( y );
+ unsigned int bpl = QMIN((header.width()+7)/8, header.BytesPerLine);
+ for ( unsigned int x=0; x< bpl; ++x )
+ p[ x ] = buf[x];
}
// Set the color palette
@@ -155,14 +159,15 @@ static void readImage1( QDataStream &s )
img.setColor( 1, qRgb( 255, 255, 255 ) );
}
-static void readImage4( QDataStream &s )
+static void readImage4( QImage &img, QDataStream &s, const PCXHEADER &header )
{
QByteArray buf( header.BytesPerLine*4 );
- QByteArray pixbuf( w );
+ QByteArray pixbuf( header.width() );
- img.create( w, h, 8, 16, QImage::IgnoreEndian );
+ if(!img.create( header.width(), header.height(), 8, 16 ))
+ return;
- for ( int y=0; y<h; ++y )
+ for ( int y=0; y<header.height(); ++y )
{
if ( s.atEnd() )
{
@@ -171,20 +176,19 @@ static void readImage4( QDataStream &s )
}
pixbuf.fill( 0 );
- readLine( s, buf );
+ readLine( s, buf, header );
for ( int i=0; i<4; i++ )
{
Q_UINT32 offset = i*header.BytesPerLine;
- for ( int x=0; x<w; ++x )
+ for ( unsigned int x=0; x<header.width(); ++x )
if ( buf[ offset + ( x/8 ) ] & ( 128 >> ( x%8 ) ) )
pixbuf[ x ] += ( 1 << i );
}
uchar *p = img.scanLine( y );
-
- for ( int x=0; x<w; ++x )
- *p++ = pixbuf[ x ];
+ for ( unsigned int x=0; x<header.width(); ++x )
+ p[ x ] = pixbuf[ x ];
}
// Read the palette
@@ -192,13 +196,14 @@ static void readImage4( QDataStream &s )
img.setColor( i, header.ColorMap.color( i ) );
}
-static void readImage8( QDataStream &s )
+static void readImage8( QImage &img, QDataStream &s, const PCXHEADER &header )
{
QByteArray buf( header.BytesPerLine );
- img.create( w, h, 8, 256, QImage::IgnoreEndian );
+ if(!img.create( header.width(), header.height(), 8, 256 ))
+ return;
- for ( int y=0; y<h; ++y )
+ for ( int y=0; y<header.height(); ++y )
{
if ( s.atEnd() )
{
@@ -206,19 +211,19 @@ static void readImage8( QDataStream &s )
return;
}
- readLine( s, buf );
+ readLine( s, buf, header );
uchar *p = img.scanLine( y );
-
- for ( int x=0; x<header.BytesPerLine; ++x )
- *p++ = buf[ x ];
+ unsigned int bpl = QMIN(header.BytesPerLine, header.width());
+ for ( unsigned int x=0; x<bpl; ++x )
+ p[ x ] = buf[ x ];
}
Q_UINT8 flag;
s >> 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<h; ++y )
+ for ( int y=0; y<header.height(); ++y )
{
if ( s.atEnd() )
{
@@ -246,14 +252,13 @@ static void readImage24( QDataStream &s
return;
}
- readLine( s, r_buf );
- readLine( s, g_buf );
- readLine( s, b_buf );
+ readLine( s, r_buf, header );
+ readLine( s, g_buf, header );
+ readLine( s, b_buf, header );
uint *p = ( uint * )img.scanLine( y );
-
- for ( int x=0; x<header.BytesPerLine; ++x )
- *p++ = qRgb( r_buf[ x ], g_buf[ x ], b_buf[ x ] );
+ for ( unsigned int x=0; x<header.width(); ++x )
+ p[ x ] = qRgb( r_buf[ x ], g_buf[ x ], b_buf[ x ] );
}
}
@@ -268,6 +273,8 @@ KDE_EXPORT void kimgio_pcx_read( QImageI
return;
}
+ PCXHEADER header;
+
s >> 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; y<h; ++y )
+ for ( int y=0; y<header.height(); ++y )
{
Q_UINT8 *p = img.scanLine( y );
+ // Invert as QImage uses reverse palette for monochrome images?
for ( int i=0; i<header.BytesPerLine; ++i )
- buf[ i ] = p[ i ];
+ buf[ i ] = ~p[ i ];
writeLine( s, buf );
}
}
-static void writeImage4( QDataStream &s )
+static void writeImage4( QImage &img, QDataStream &s, PCXHEADER &header )
{
header.Bpp = 1;
header.NPlanes = 4;
- header.BytesPerLine = w/8;
+ header.BytesPerLine = header.width()/8;
for ( int i=0; i<16; ++i )
header.ColorMap.setColor( i, img.color( i ) );
@@ -401,14 +401,14 @@ static void writeImage4( QDataStream &s
for ( int i=0; i<4; ++i )
buf[ i ].resize( header.BytesPerLine );
- for ( int y=0; y<h; ++y )
+ for ( int y=0; y<header.height(); ++y )
{
Q_UINT8 *p = img.scanLine( y );
for ( int i=0; i<4; ++i )
buf[ i ].fill( 0 );
- for ( int x=0; x<w; ++x )
+ for ( unsigned int x=0; x<header.width(); ++x )
{
for ( int i=0; i<4; ++i )
if ( *( p+x ) & ( 1 << i ) )
@@ -420,7 +420,7 @@ static void writeImage4( QDataStream &s
}
}
-static void writeImage8( QDataStream &s )
+static void writeImage8( QImage &img, QDataStream &s, PCXHEADER &header )
{
header.Bpp = 8;
header.NPlanes = 1;
@@ -430,7 +430,7 @@ static void writeImage8( QDataStream &s
QByteArray buf( header.BytesPerLine );
- for ( int y=0; y<h; ++y )
+ for ( int y=0; y<header.height(); ++y )
{
Q_UINT8 *p = img.scanLine( y );
@@ -449,23 +449,23 @@ static void writeImage8( QDataStream &s
s << RGB( img.color( i ) );
}
-static void writeImage24( QDataStream &s )
+static void writeImage24( QImage &img, QDataStream &s, PCXHEADER &header )
{
header.Bpp = 8;
header.NPlanes = 3;
- header.BytesPerLine = w;
+ header.BytesPerLine = header.width();
s << header;
- QByteArray r_buf( w );
- QByteArray g_buf( w );
- QByteArray b_buf( w );
+ QByteArray r_buf( header.width() );
+ QByteArray g_buf( header.width() );
+ QByteArray b_buf( header.width() );
- for ( int y=0; y<h; ++y )
+ for ( int y=0; y<header.height(); ++y )
{
uint *p = ( uint * )img.scanLine( y );
- for ( int x=0; x<w; ++x )
+ for ( unsigned int x=0; x<header.width(); ++x )
{
QRgb rgb = *p++;
r_buf[ x ] = qRed( rgb );
@@ -484,10 +484,10 @@ KDE_EXPORT void kimgio_pcx_write( QImage
QDataStream s( io->ioDevice() );
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<QRgb *>(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<QRgb *>(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 <stdio.h>
#include <string.h>
+#include <stdlib.h>
#include <qimage.h>
#include <kdelibs_export.h>
@@ -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;
}