[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: extragear/graphics/gwenview
From: Aurélien Gâteau <aurelien.gateau () free ! fr>
Date: 2006-10-09 0:20:58
Message-ID: 1160353258.716417.15593.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 593767 by gateau:
Finished reworking of ImageLoader and DocumentLoadingImpl to load JPEG images
correctly rotated from the start.
BUG: 117173
M +2 -0 NEWS
M +2 -9 gvcore/documentloadingimpl.cpp
M +0 -1 gvcore/documentloadingimpl.h
M +29 -39 gvcore/imageloader.cpp
M +1 -2 gvcore/imageloader.h
--- trunk/extragear/graphics/gwenview/NEWS #593766:593767
@@ -2,6 +2,8 @@
- Fixes:
- Fix crash when showing current folder properties from context menu (Bug
129890)
+ - Load JPEG rotated images using the right rotation directly instead of
+ loading them first and rotate them after (Bug 117173)
2006.09.16 - v1.4.0
- Fixes:
--- trunk/extragear/graphics/gwenview/gvcore/documentloadingimpl.cpp #593766:593767
@@ -89,7 +89,6 @@
connect( d->mLoader, SIGNAL( urlKindDetermined()), SLOT( slotURLKindDetermined() ));
connect( d->mLoader, SIGNAL( sizeLoaded( int, int )), SLOT( sizeLoaded( int, int )));
connect( d->mLoader, SIGNAL( imageChanged( const QRect& )), SLOT( imageChanged( const QRect& )));
- connect( d->mLoader, SIGNAL( frameLoaded()), SLOT( frameLoaded()));
connect( d->mLoader, SIGNAL( imageLoaded( bool )), SLOT( imageLoaded( bool )));
// it's possible the loader already has the whole or at least part of the image loaded
@@ -106,7 +105,7 @@
}
}
}
- if( d->mLoader->completed()) emit imageLoaded( d->mLoader->frames().count() != 0 );
+ if( d->mLoader->completed()) imageLoaded( d->mLoader->frames().count() != 0 );
// 'this' may be deleted here
}
@@ -146,17 +145,11 @@
void DocumentLoadingImpl::imageChanged(const QRect& rect) {
- //if( d->mLoader->frames().count() > 0 ) return;
+ LOG(rect);
setImage(d->mLoader->processedImage());
emit rectUpdated(rect);
}
-void DocumentLoadingImpl::frameLoaded() {
- if( d->mLoader->frames().count() == 1 ) {
- // explicit sharing - don't modify the image in document anymore
- setImage(d->mLoader->frames().first().image.copy());
- }
-}
void DocumentLoadingImpl::sizeLoaded(int width, int height) {
LOG(width << "x" << height);
--- trunk/extragear/graphics/gwenview/gvcore/documentloadingimpl.h #593766:593767
@@ -46,7 +46,6 @@
void slotURLKindDetermined();
void sizeLoaded(int, int);
void imageChanged(const QRect&);
- void frameLoaded();
void imageLoaded( bool ok );
};
--- trunk/extragear/graphics/gwenview/gvcore/imageloader.cpp #593766:593767
@@ -266,6 +266,14 @@
MimeTypeUtils::Kind mURLKind;
QValueVector< OwnerData > mOwners; // loaders may be shared
+
+
+ void determineImageFormat() {
+ Q_ASSERT(mRawData.size()>0);
+ QBuffer buffer(mRawData);
+ buffer.open(IO_ReadOnly);
+ mImageFormat = QImageIO::imageFormat(&buffer);
+ }
};
@@ -339,26 +347,22 @@
// We have the image in cache
LOG(d->mURL << ", We have the image in cache");
d->mRawData = Cache::instance()->file( d->mURL );
- QCString format;
- ImageFrames frames;
- Cache::instance()->getFrames( d->mURL, &frames, &format );
- if( !frames.isEmpty()) {
+ Cache::instance()->getFrames(d->mURL, &d->mFrames, &d->mImageFormat);
+
+ if( !d->mFrames.isEmpty()) {
LOG("The image in cache can be used");
- d->mImageFormat = format;
- d->mFrames = frames;
d->mProcessedImage = d->mFrames[0].image;
emit sizeLoaded(d->mProcessedImage.width(), d->mProcessedImage.height());
emit imageChanged(d->mProcessedImage.rect());
- if( !d->mRawData.isNull() || format != "JPEG" ) {
- // The raw data is only needed for JPEG. If it is already
- // loaded or if we are not loading a JPEG file, we are done.
- finish( true );
- return;
- } else {
- // Wait for raw data to be downloaded
+ if (d->mRawData.isNull() && d->mImageFormat=="JPEG") {
+ // Raw data is needed for JPEG, wait for it to be downloaded
LOG("Wait for raw data to be downloaded");
d->mDecodeState = DECODE_CACHED;
+ } else {
+ // We don't care about raw data
+ finish(true);
+ return;
}
} else {
// Image in cache is broken
@@ -451,14 +455,8 @@
}
LOG("emit urlKindDetermined(raster)");
emit urlKindDetermined();
-
- // Set image format
- QBuffer buffer(d->mRawData);
- buffer.open(IO_ReadOnly);
- d->mImageFormat = QImageIO::imageFormat(&buffer);
- buffer.close();
}
-
+
// Decode the received data
if( !d->mDecoderTimer.isActive() &&
(d->mDecodeState==DECODE_WAITING || d->mDecodeState==DECODE_INCREMENTAL_DECODING)
@@ -549,14 +547,14 @@
/**
- * Make the final adjustments to the image.
+ * Cache image and emit imageLoaded
*/
void ImageLoader::finish( bool ok ) {
LOG("");
d->mDecodeState = DECODE_DONE;
- if( !ok /*|| d->mFrames.count() == 0 */) {
+ if (!ok) {
d->mFrames.clear();
d->mRawData = QByteArray();
d->mImageFormat = QCString();
@@ -565,22 +563,11 @@
return;
}
- Cache::instance()->addImage( d->mURL, d->mFrames, d->mImageFormat, d->mTimestamp );
-
- /*
- ImageFrame lastframe = d->mFrames.last();
- d->mFrames.pop_back(); // maintain that processedImage() is not included when calling imageChanged()
- d->mProcessedImage = lastframe.image;
- // The decoder did not cause some signals to be emitted, let's do it now
- if (d->mLoadedRegion.isEmpty()) {
- emit sizeLoaded(d->mProcessedImage.width(), d->mProcessedImage.height());
+ if (d->mImageFormat.isEmpty()) {
+ d->determineImageFormat();
}
- if (!d->mLoadChangedRect.isEmpty()) {
- emit imageChanged( d->mLoadChangedRect );
- }
- d->mFrames.push_back( lastframe );
- */
-
+ Q_ASSERT(d->mFrames.count() > 0);
+ Cache::instance()->addImage( d->mURL, d->mFrames, d->mImageFormat, d->mTimestamp );
emit imageLoaded( true );
}
@@ -654,7 +641,7 @@
void ImageLoader::changed(const QRect& constRect) {
- LOG("");
+ LOG2("");
QRect rect = constRect;
if (d->mLoadedRegion.isEmpty()) {
@@ -665,6 +652,10 @@
// By default, mProcessedImage should use the image from mDecoder
d->mProcessedImage = d->mDecoder.image();
+ if (d->mImageFormat.isEmpty()) {
+ d->determineImageFormat();
+ }
+ Q_ASSERT(!d->mImageFormat.isEmpty());
if (d->mImageFormat == "JPEG") {
// This is a JPEG, extract orientation and adjust mProcessedImage
// if necessary
@@ -771,7 +762,6 @@
}
d->mFrames.append( ImageFrame( image, d->mNextFrameDelay ));
d->mNextFrameDelay = 0;
- emit frameLoaded();
}
void ImageLoader::setLooping(int) {
--- trunk/extragear/graphics/gwenview/gvcore/imageloader.h #593766:593767
@@ -76,8 +76,7 @@
signals:
void urlKindDetermined();
void sizeLoaded(int, int);
- void imageChanged(const QRect&); // use processedImage(), is not in frames() yet
- void frameLoaded();
+ void imageChanged(const QRect&);
void imageLoaded( bool ok );
private slots:
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic