author | alwin <alwin> | 2004-11-01 13:33:51 (UTC) |
---|---|---|
committer | alwin <alwin> | 2004-11-01 13:33:51 (UTC) |
commit | 915af02212ea80e43da5bcc24415e3e48778bea9 (patch) (side-by-side diff) | |
tree | eff6dbcc2f1e62dfbb8f6ababe183306fe2077e1 /noncore/graphics/opie-eye | |
parent | b3153506a1be76a386f23a3af44f84042d148111 (diff) | |
download | opie-915af02212ea80e43da5bcc24415e3e48778bea9.zip opie-915af02212ea80e43da5bcc24415e3e48778bea9.tar.gz opie-915af02212ea80e43da5bcc24415e3e48778bea9.tar.bz2 |
when jpeg image is smaller than requested thumbsize it will not use
scaled loading
-rw-r--r-- | noncore/graphics/opie-eye/slave/jpeg_slave.cpp | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/noncore/graphics/opie-eye/slave/jpeg_slave.cpp b/noncore/graphics/opie-eye/slave/jpeg_slave.cpp index fb7d5de..1bb81d9 100644 --- a/noncore/graphics/opie-eye/slave/jpeg_slave.cpp +++ b/noncore/graphics/opie-eye/slave/jpeg_slave.cpp @@ -10,13 +10,13 @@ using namespace Opie::Core; /* QT */ #include <qobject.h> #include <qimage.h> /** - exif.h + exif.h */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> @@ -263,13 +263,13 @@ int ExifData::ReadJpegSections (QFile & infile, ReadMode_t ReadMode) for (a=0;a<7;a++){ marker = infile.getch(); if (marker != 0xff) break; if (a >= 6){ - owarn << "too many padding bytes" << oendl; + owarn << "too many padding bytes" << oendl; return false; } } if (marker == 0xff){ @@ -328,20 +328,20 @@ int ExifData::ReadJpegSections (QFile & infile, ReadMode_t ReadMode) SectionsRead ++; //HaveAll = 1; } return true; case M_EOI: // in case it's a tables-only JPEG stream - owarn << "No image in jpeg!" << oendl; + owarn << "No image in jpeg!" << oendl; return false; case M_COM: // Comment section - // pieczy 2002-02-12 - // now the User comment goes to UserComment - // so we can store a Comment section also in READ_EXIF mode - process_COM(Data, itemlen); + // pieczy 2002-02-12 + // now the User comment goes to UserComment + // so we can store a Comment section also in READ_EXIF mode + process_COM(Data, itemlen); break; case M_JFIF: // Regular jpegs always have this tag, exif images have the exif // marker instead, althogh ACDsee will write images with both markers. // this program will re-create this marker on absence of exif marker. @@ -544,20 +544,20 @@ void ExifData::ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBa case TAG_MAKE: ExifData::CameraMake = QString((char*)ValuePtr); break; case TAG_MODEL: ExifData::CameraModel = QString((char*)ValuePtr); - break; + break; case TAG_ORIENTATION: Orientation = (int)ConvertAnyFormat(ValuePtr, Format); break; case TAG_DATETIME_ORIGINAL: - DateTime = QString((char*)ValuePtr); + DateTime = QString((char*)ValuePtr); break; case TAG_USERCOMMENT: // Olympus has this padded with trailing spaces. Remove these first. for (a=ByteCount;;){ a--; @@ -586,13 +586,13 @@ void ExifData::ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBa } break; case TAG_FNUMBER: // Simplest way of expressing aperture, so I trust it the most. // (overwrite previously computd value if there is one) - ExifData::ApertureFNumber = (float)ConvertAnyFormat(ValuePtr, Format); + ExifData::ApertureFNumber = (float)ConvertAnyFormat(ValuePtr, Format); break; case TAG_APERTURE: case TAG_MAXAPERTURE: // More relevant info always comes earlier, so only use this field if we don't // have appropriate aperture information yet. @@ -663,18 +663,18 @@ void ExifData::ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBa } break; // Remaining cases contributed by: Volker C. Schoech (schoech@gmx.de) case TAG_EXPOSURE_BIAS: - ExifData::ExposureBias = (float)ConvertAnyFormat(ValuePtr, Format); - break; + ExifData::ExposureBias = (float)ConvertAnyFormat(ValuePtr, Format); + break; case TAG_WHITEBALANCE: ExifData::Whitebalance = (int)ConvertAnyFormat(ValuePtr, Format); - break; + break; case TAG_METERING_MODE: ExifData::MeteringMode = (int)ConvertAnyFormat(ValuePtr, Format); break; case TAG_EXPOSURE_PROGRAM: @@ -717,23 +717,23 @@ void ExifData::ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBa // directory. this has got to be the result of a comitee! unsigned char * SubdirStart; unsigned Offset; if (DIR_ENTRY_ADDR(DirStart, NumDirEntries) + 4 <= OffsetBase+ExifLength){ Offset = Get32u(DIR_ENTRY_ADDR(DirStart, NumDirEntries)); - // There is at least one jpeg from an HP camera having an Offset of almost MAXUINT. - // Adding OffsetBase to it produces an overflow, so compare with ExifLength here. - // See http://bugs.kde.org/show_bug.cgi?id=54542 - if (Offset && Offset < ExifLength){ + // There is at least one jpeg from an HP camera having an Offset of almost MAXUINT. + // Adding OffsetBase to it produces an overflow, so compare with ExifLength here. + // See http://bugs.kde.org/show_bug.cgi?id=54542 + if (Offset && Offset < ExifLength){ SubdirStart = OffsetBase + Offset; if (SubdirStart > OffsetBase+ExifLength){ if (SubdirStart < OffsetBase+ExifLength+20){ // Jhead 1.3 or earlier would crop the whole directory! // As Jhead produces this form of format incorrectness, // I'll just let it pass silently - owarn << "Thumbnail removed with Jhead 1.3 or earlier" << oendl; + owarn << "Thumbnail removed with Jhead 1.3 or earlier" << oendl; }else{ return; } }else{ if (SubdirStart <= OffsetBase+ExifLength){ ProcessExifDir(SubdirStart, OffsetBase, ExifLength); @@ -745,13 +745,13 @@ void ExifData::ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBa } } if (ThumbnailSize && ThumbnailOffset){ if (ThumbnailSize + ThumbnailOffset <= ExifLength){ // The thumbnail pointer appears to be valid. Store it. - Thumbnail.loadFromData(OffsetBase + ThumbnailOffset, ThumbnailSize, "JPEG"); + Thumbnail.loadFromData(OffsetBase + ThumbnailOffset, ThumbnailSize, "JPEG"); } } } //-------------------------------------------------------------------------- // Process a COM marker. We want to leave the bytes unchanged. The @@ -914,13 +914,13 @@ bool ExifData::scan(const QString & path) f.open(IO_ReadOnly); // Scan the JPEG headers. ret = ReadJpegSections(f, READ_EXIF); if (ret == false){ - owarn << "Not JPEG file!" << oendl; + owarn << "Not JPEG file!" << oendl; DiscardData(); f.close(); return false; } f.close(); DiscardData(); @@ -1412,17 +1412,25 @@ QString JpegSlave::fullImageInfo( const QString& path) { return tag; } QPixmap JpegSlave::pixmap( const QString& path, int wid, int hei) { ExifData ImageInfo; + /* + */ if ( !ImageInfo.scan( path ) || ImageInfo.isNullThumbnail() ) { QImage img; QImageIO iio( path, 0l ); - QString str = QString( "Fast Shrink( 4 ) Scale( %1, %2, ScaleFree)" ).arg( wid ).arg( hei ); - iio.setParameters( str.latin1() );// will be strdupped anyway + if (wid < ImageInfo.getWidth() || hei<ImageInfo.getHeight()) { + odebug << "Scaling "<<ImageInfo.getWidth()<<"x"<<ImageInfo.getHeight() + << " to "<<wid<<"x"<<hei<< " ("<<path<<")"<<oendl; + QString str = QString( "Fast Shrink( 4 ) Scale( %1, %2, ScaleFree)" ).arg( wid ).arg( hei ); + iio.setParameters( str.latin1() );// will be strdupped anyway + } else { + odebug << "Not scaling "<<ImageInfo.getWidth()<<"x"<<ImageInfo.getHeight()<< " ("<<path<<")"<<oendl; + } img = iio.read() ? iio.image() : QImage(); return ThumbNailTool::scaleImage( img, wid,hei ); }else{ QImage img = ImageInfo.getThumbnail(); return ThumbNailTool::scaleImage( img, wid,hei ); } |