summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/graphics/opie-eye/gui/imagescrollview.cpp86
-rw-r--r--noncore/graphics/opie-eye/gui/imagescrollview.h3
2 files changed, 83 insertions, 6 deletions
diff --git a/noncore/graphics/opie-eye/gui/imagescrollview.cpp b/noncore/graphics/opie-eye/gui/imagescrollview.cpp
index 2f16d82..d034ee0 100644
--- a/noncore/graphics/opie-eye/gui/imagescrollview.cpp
+++ b/noncore/graphics/opie-eye/gui/imagescrollview.cpp
@@ -1,16 +1,19 @@
#include "imagescrollview.h"
#include <opie2/odebug.h>
+#include <opie2/oapplication.h>
+#include <opie2/owait.h>
using namespace Opie::Core;
#include <qimage.h>
#include <qlayout.h>
+#include <qpe/qcopenvelope_qws.h>
ImageScrollView::ImageScrollView( QWidget* parent, const char* name, WFlags f )
:QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(),scale_to_fit(true),
rotate_to_fit(true),show_zoomer(true),first_resize_done(false),m_lastName("")
{
init();
}
@@ -33,28 +36,86 @@ ImageScrollView::ImageScrollView (const QString&img, QWidget * parent, const cha
void ImageScrollView::setImage(const QImage&img)
{
_image_data = QImage();
_original_data=img;
_original_data.convertDepth(QPixmap::defaultDepth());
_original_data.setAlphaBuffer(false);
m_lastName = "";
+ image_is_jpeg = false;
+ image_scaled_loaded = false;
if (first_resize_done) {
generateImage();
}
}
+void ImageScrollView::loadJpeg(bool interncall)
+{
+ if (m_lastName.isEmpty()) return;
+ QImageIO iio( m_lastName, 0l );
+ QString param;
+ bool real_load = false;
+ if (scale_to_fit) {
+ if (!interncall) {
+ int wid, hei;
+ wid = QApplication::desktop()->width();
+ hei = QApplication::desktop()->height();
+ if (hei>wid) {
+ wid = hei;
+ } else {
+ hei = wid;
+ }
+ param = QString( "Fast Shrink( 7 ) Scale( %1, %2, ScaleFree)" ).arg( wid ).arg( hei );
+ odebug << "Load jpeg scaled \"" << param << "\"" << oendl;
+ iio.setParameters(param.latin1());
+ image_scaled_loaded = true;
+ real_load = true;
+ }
+ } else {
+ if (image_scaled_loaded||!interncall) {
+ odebug << "Load jpeg unscaled" << oendl;
+ real_load = true;
+ }
+ image_scaled_loaded = false;
+ }
+ if (real_load) {
+ {
+ QCopEnvelope( "QPE/System", "busy()" );
+ }
+ _original_data = iio.read() ? iio.image() : QImage();
+ {
+ QCopEnvelope env( "QPE/System", "notBusy(QString)" );
+ env << "Image loaded";
+ }
+ }
+}
+
void ImageScrollView::setImage( const QString& path ) {
odebug << "load new image " << oendl;
if (m_lastName == path) return;
m_lastName = path;
- _original_data.load(path);
- _original_data.convertDepth(QPixmap::defaultDepth());
- _original_data.setAlphaBuffer(false);
+ QString itype = QImage::imageFormat(m_lastName);
+ odebug << "Image type = " << itype << oendl;
+ if (itype == "JPEG") {
+ image_is_jpeg = true;
+ loadJpeg();
+ } else {
+ {
+ QCopEnvelope( "QPE/System", "busy()" );
+ }
+ image_is_jpeg = false;
+ _original_data.load(path);
+ _original_data.convertDepth(QPixmap::defaultDepth());
+ _original_data.setAlphaBuffer(false);
+ {
+ QCopEnvelope env( "QPE/System", "notBusy(QString)" );
+ env << "Image loaded";
+ }
+ }
_image_data = QImage();
if (first_resize_done) {
generateImage();
}
}
/* should be called every time the QImage changed it content */
void ImageScrollView::init()
@@ -72,16 +133,18 @@ void ImageScrollView::init()
_zoomer, (SLOT(setVisiblePoint(int,int))) );
connect(this,SIGNAL(imageSizeChanged(const QSize&)),
_zoomer, SLOT(setImageSize(const QSize&)) );
connect(this,SIGNAL(viewportSizeChanged(const QSize&)),
_zoomer, SLOT(setViewPortSize(const QSize&)) );
viewport()->setBackgroundColor(white);
setFocusPolicy(QWidget::StrongFocus);
+ image_scaled_loaded = false;
+ image_is_jpeg = false;
if (first_resize_done) {
last_rot = Rotate0;
generateImage();
} else if (_original_data.size().isValid()) {
if (image_fit_into(_original_data.size()) || !show_zoomer) _zoomer->hide();
resizeContents(_original_data.width(),_original_data.height());
}
}
@@ -98,16 +161,19 @@ void ImageScrollView::setAutoRotate(bool how)
void ImageScrollView::setAutoScale(bool how)
{
scale_to_fit = how;
if (!how) {
rotate_to_fit = false;
}
_image_data = QImage();
+ if (image_is_jpeg && how == false && image_scaled_loaded==true) {
+ loadJpeg(true);
+ }
generateImage();
}
ImageScrollView::~ImageScrollView()
{
}
void ImageScrollView::rescaleImage(int w, int h)
@@ -235,20 +301,24 @@ void ImageScrollView::rotate_into_data(Rotation r)
}
_image_data = dest;
}
void ImageScrollView::generateImage()
{
Rotation r = Rotate0;
+ {
+ QCopEnvelope( "QPE/System", "busy()" );
+ }
if (width()>height()&&_original_data.width()<_original_data.height() ||
width()<height()&&_original_data.width()>_original_data.height()) {
if (rotate_to_fit) r = Rotate90;
}
+
odebug << " r = " << r << oendl;
if (scale_to_fit) {
if (!_image_data.size().isValid()||width()>_image_data.width()||height()>_image_data.height()) {
odebug << "Rescaling data" << oendl;
if (r==Rotate0) {
_image_data = _original_data;
} else {
rotate_into_data(r);
@@ -261,35 +331,39 @@ void ImageScrollView::generateImage()
_image_data = _original_data;
} else {
rotate_into_data(r);
}
last_rot = r;
resizeContents(_image_data.width(),_image_data.height());
}
_pdata.convertFromImage(_image_data);
-
+
/*
* update the zoomer
*/
- check_zoomer();
+ check_zoomer();
emit imageSizeChanged( _image_data.size() );
rescaleImage( 128, 128 );
/*
* move scrollbar
*/
_zoomer->setGeometry( viewport()->width()-_image_data.width()/2, viewport()->height()-_image_data.height()/2,
_image_data.width()/2, _image_data.height()/2 );
-
+
_zoomer->setImage( _image_data );
/*
* invalidate
*/
_image_data=QImage();
+ {
+ QCopEnvelope env( "QPE/System", "notBusy(QString)" );
+ env << "Image generated";
+ }
}
void ImageScrollView::resizeEvent(QResizeEvent * e)
{
odebug << "ImageScrollView resizeEvent" << oendl;
QScrollView::resizeEvent(e);
generateImage();
first_resize_done = true;
diff --git a/noncore/graphics/opie-eye/gui/imagescrollview.h b/noncore/graphics/opie-eye/gui/imagescrollview.h
index e209dfb..f6e187d 100644
--- a/noncore/graphics/opie-eye/gui/imagescrollview.h
+++ b/noncore/graphics/opie-eye/gui/imagescrollview.h
@@ -52,22 +52,25 @@ protected:
QPixmap _pdata;
int _mouseStartPosX,_mouseStartPosY;
bool scale_to_fit;
bool rotate_to_fit;
bool show_zoomer;
bool first_resize_done;
+ bool image_is_jpeg;
+ bool image_scaled_loaded;
Rotation last_rot;
QString m_lastName;
virtual void rescaleImage(int w, int h);
virtual void rotate_into_data(Rotation r);
virtual void generateImage();
+ virtual void loadJpeg(bool interncall = false);
bool image_fit_into(const QSize&s);
void check_zoomer();
protected slots:
virtual void viewportMouseMoveEvent(QMouseEvent* e);
virtual void contentsMousePressEvent ( QMouseEvent * e);
virtual void resizeEvent(QResizeEvent * e);
virtual void keyPressEvent(QKeyEvent * e);