summaryrefslogtreecommitdiffstats
path: root/kipi-plugins/slideshow/imageloadthread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kipi-plugins/slideshow/imageloadthread.cpp')
-rw-r--r--kipi-plugins/slideshow/imageloadthread.cpp180
1 files changed, 180 insertions, 0 deletions
diff --git a/kipi-plugins/slideshow/imageloadthread.cpp b/kipi-plugins/slideshow/imageloadthread.cpp
new file mode 100644
index 0000000..36f40c8
--- /dev/null
+++ b/kipi-plugins/slideshow/imageloadthread.cpp
@@ -0,0 +1,180 @@
+/* ============================================================
+ *
+ * This file is a part of kipi-plugins project
+ * http://www.kipi-plugins.org
+ *
+ * Date : 2007-11-14
+ * Description : a kipi plugin to slide images.
+ *
+ * Copyright (C) 2007 by Valerio Fuoglio <valerio dot fuoglio at gmail dot com>
+ *
+ * Parts of this code are based on smoothslidesaver by Carsten Weinhold
+ * <carsten dot weinhold at gmx dot de>
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * ============================================================ */
+
+// Qt includes.
+
+#include <qdir.h>
+#include <qvaluevector.h>
+#include <qdeepcopy.h>
+#include <qwmatrix.h>
+#include <qobject.h>
+
+// KDE includes.
+
+#include <klocale.h>
+
+// Local includes.
+
+#include "slideshowkb.h"
+#include "imageloadthread.h"
+#include "imageloadthread.moc"
+
+namespace KIPISlideShowPlugin
+{
+
+ImageLoadThread::ImageLoadThread(QValueList<QPair<QString, int> >& fileList,
+ int width, int height)
+{
+
+ m_initialized = false;
+ m_needImage = true;
+ m_haveImages = false;
+ m_quitRequested = false;
+
+ m_fileIndex = 0;
+ m_fileList = fileList;
+
+ m_width = width;
+ m_height = height;
+}
+
+void ImageLoadThread::quit() {
+
+ QMutexLocker locker(&m_condLock);
+
+ m_quitRequested = true;
+ m_imageRequest.wakeOne();
+}
+
+void ImageLoadThread::requestNewImage() {
+
+ QMutexLocker locker(&m_condLock);
+
+ if ( !m_needImage) {
+ m_needImage = true;
+ m_imageRequest.wakeOne();
+ }
+}
+
+void ImageLoadThread::run() {
+
+ QMutexLocker locker(&m_condLock);
+
+ // we enter the loop with m_needImage==true, so we will immediatly
+ // try to load an image
+
+ while (true) {
+
+ if (m_quitRequested)
+ break;
+
+ if (m_needImage) {
+
+ if ( m_fileIndex == (int)m_fileList.count() )
+ {
+ m_needImage = false;
+ emit(endOfShow());
+ continue;
+ }
+
+ m_needImage = false;
+ m_condLock.unlock();
+
+ bool ok;
+ do {
+ ok = loadImage();
+ if ( !ok)
+ invalidateCurrentImageName();
+ } while ( !ok && m_fileIndex < (int)m_fileList.count());
+
+ if ( m_fileIndex == (int)m_fileList.count() )
+ {
+
+ emit(endOfShow());
+ m_condLock.lock();
+ continue;
+ }
+
+ if ( !ok) {
+ // generate a black dummy image
+ m_texture = QImage(128, 128, 32);
+ m_texture.fill(Qt::black.rgb());
+ }
+
+ m_condLock.lock();
+
+ m_fileIndex++;
+
+ if ( !m_initialized) {
+ m_haveImages = ok;
+ m_initialized = true;
+ }
+
+ } else {
+ // wait for new requests from the consumer
+ m_imageRequest.wait(&m_condLock);
+ }
+ }
+}
+
+bool ImageLoadThread::loadImage() {
+
+ QPair<QString, int> fileAngle = m_fileList[m_fileIndex];
+ QString path(fileAngle.first);
+ int angle(fileAngle.second);
+ QImage image(path);
+ if (angle != 0)
+ {
+ QWMatrix wm;
+ wm.rotate(angle);
+ image = image.xForm(wm);
+ }
+
+ if (image.isNull()) {
+ return false;
+ }
+
+ float aspect = (float)image.width() / (float)image.height();
+
+ image = image.smoothScale(m_width, m_height, QImage::ScaleMin);
+
+ m_imageLock.lock();
+
+ // this is the critical moment, when we make the new texture and
+ // aspect available to the consumer
+ m_textureAspect = aspect;
+ m_texture = QGLWidget::convertToGLFormat(image);
+
+ m_imageLock.unlock();
+
+ return true;
+}
+
+void ImageLoadThread::invalidateCurrentImageName() {
+ m_fileList.remove(m_fileList[m_fileIndex]);
+ m_fileIndex++;
+}
+
+} // NameSpace KIPISlideShowPlugin