[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