summaryrefslogtreecommitdiff
authoralwin <alwin>2004-04-15 16:16:47 (UTC)
committer alwin <alwin>2004-04-15 16:16:47 (UTC)
commitaa0fce09fc2df5427c43b6a5f0539e725aad2828 (patch) (side-by-side diff)
treeee9cd98bed9222fa994d89cab76a2f515b2cd45b
parenta002be54e33d64e69c7edf2960d5e68a9a0609e4 (diff)
downloadopie-aa0fce09fc2df5427c43b6a5f0539e725aad2828.zip
opie-aa0fce09fc2df5427c43b6a5f0539e725aad2828.tar.gz
opie-aa0fce09fc2df5427c43b6a5f0539e725aad2828.tar.bz2
hopefull better repainting when switching the image while view is
visible
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiemm/oimagescrollview.cpp30
1 files changed, 11 insertions, 19 deletions
diff --git a/libopie2/opiemm/oimagescrollview.cpp b/libopie2/opiemm/oimagescrollview.cpp
index 68b06af..30a8fba 100644
--- a/libopie2/opiemm/oimagescrollview.cpp
+++ b/libopie2/opiemm/oimagescrollview.cpp
@@ -67,114 +67,116 @@ OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const c
}
void OImageScrollView::setImage(const QImage&img)
{
_image_data = QImage();
_original_data=img;
_original_data.convertDepth(QPixmap::defaultDepth());
_original_data.setAlphaBuffer(false);
m_lastName = "";
setImageIsJpeg(false);
setImageScaledLoaded(false);
if (FirstResizeDone()) {
generateImage();
}
}
void OImageScrollView::loadJpeg(bool interncall)
{
if (m_lastName.isEmpty()) return;
QImageIO iio( m_lastName, 0l );
QString param;
bool real_load = false;
if (AutoScale()) {
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( 3 ) Scale( %1, %2, ScaleFree)" ).arg( wid ).arg( hei );
+ param = QString( "Fast Shrink( 3 ) Scale( %1, %2, ScaleMin)" ).arg( wid ).arg( hei );
odebug << "Load jpeg scaled \"" << param << "\"" << oendl;
iio.setParameters(param.latin1());
setImageScaledLoaded(true);
real_load = true;
}
} else {
if (ImageScaledLoaded()||!interncall) {
odebug << "Load jpeg unscaled" << oendl;
real_load = true;
}
setImageScaledLoaded(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 OImageScrollView::setImage( const QString& path ) {
odebug << "load new image " << oendl;
if (m_lastName == path) return;
m_lastName = path;
+ _original_data = QImage();
QString itype = QImage::imageFormat(m_lastName);
odebug << "Image type = " << itype << oendl;
if (itype == "JPEG") {
setImageIsJpeg(true);
loadJpeg();
} else {
{
QCopEnvelope( "QPE/System", "busy()" );
}
setImageIsJpeg(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 (FirstResizeDone()) {
generateImage();
+ if (isVisible()) viewport()->repaint(true);
}
}
/* should be called every time the QImage changed it content */
void OImageScrollView::init()
{
odebug << "init " << oendl;
/*
* create the zoomer
* and connect ther various signals
*/
_zoomer = new Opie::MM::OImageZoomer( this, "The Zoomer" );
connect(_zoomer, SIGNAL( zoomAreaRel(int,int)),
this, SLOT(scrollBy(int,int)) );
connect(_zoomer, SIGNAL( zoomArea(int,int)),
this, SLOT(center(int,int)) );
connect(this,SIGNAL(contentsMoving(int,int)),
_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);
setImageScaledLoaded(false);
setImageIsJpeg(false);
if (FirstResizeDone()) {
m_last_rot = Rotate0;
generateImage();
} else if (_original_data.size().isValid()) {
@@ -321,97 +323,102 @@ void OImageScrollView::rotate_into_data(Rotation r)
destData[_original_data.width()-x-1] = srcData[x];
}
break;
case Rotate270:
dest.create(_original_data.height(), _original_data.width(), _original_data.depth());
dest.setNumColors(_original_data.numColors());
srcTable = (unsigned int *)_original_data.colorTable();
destTable = (unsigned int *)dest.colorTable();
for ( x=0; x < _original_data.numColors(); ++x )
destTable[x] = srcTable[x];
for ( y=0; y < _original_data.height(); ++y )
{
srcData = (unsigned char *)_original_data.scanLine(y);
for ( x=0; x < _original_data.width(); ++x )
{
destData = (unsigned char *)dest.scanLine(_original_data.width()-x-1);
destData[y] = srcData[x];
}
}
break;
default:
dest = _original_data;
break;
}
}
_image_data = dest;
}
void OImageScrollView::generateImage()
{
Rotation r = Rotate0;
- if (_original_data.isNull()) return;
+ _pdata = QPixmap();
+ if (_original_data.isNull()) {
+ emit imageSizeChanged( _image_data.size() );
+ if (_zoomer) _zoomer->setImage( _image_data );
+ return;
+ }
{
QCopEnvelope( "QPE/System", "busy()" );
}
if (width()>height()&&_original_data.width()<_original_data.height() ||
width()<height()&&_original_data.width()>_original_data.height()) {
if (AutoRotate()) r = Rotate90;
}
+
odebug << " r = " << r << oendl;
- if (AutoScale()) {
+ if (AutoScale() && (_original_data.width()>width() || _original_data.height() > height()) ) {
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);
}
}
rescaleImage(width(),height());
resizeContents(_image_data.width(),_image_data.height());
} else if (!FirstResizeDone()||r!=m_last_rot||_image_data.width()==0) {
if (r==Rotate0) {
_image_data = _original_data;
} else {
rotate_into_data(r);
}
m_last_rot = r;
resizeContents(_image_data.width(),_image_data.height());
}
_pdata.convertFromImage(_image_data);
-
/*
* update the zoomer
*/
check_zoomer();
emit imageSizeChanged( _image_data.size() );
rescaleImage( 128, 128 );
/*
* move scrollbar
*/
if (_zoomer) {
_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 OImageScrollView::resizeEvent(QResizeEvent * e)
{
odebug << "OImageScrollView resizeEvent" << oendl;
QScrollView::resizeEvent(e);
generateImage();
setFirstResizeDone(true);
emit viewportSizeChanged( viewport()->size() );
@@ -446,85 +453,70 @@ void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clip
int h = cliph;
int x = clipx;
int y = clipy;
bool erase = false;
if (!_pdata.size().isValid()) {
p->fillRect(clipx,clipy,clipw,cliph,white);
return;
}
if (w>_pdata.width()) {
w=_pdata.width();
x = 0;
erase = true;
} else if (x+w>_pdata.width()){
x = _pdata.width()-w;
}
if (h>_pdata.height()) {
h=_pdata.height();
y = 0;
erase = true;
} else if (y+h>_pdata.height()){
y = _pdata.height()-h;
}
if (erase||_original_data.hasAlphaBuffer()) {
p->fillRect(clipx,clipy,clipw,cliph,white);
}
p->drawPixmap(clipx,clipy,_pdata,x,y,w,h);
}
/* using the real geometry points and not the translated points is wanted! */
void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e)
{
- odebug << "Move X and Y " << e->x() << " " << e->y() << oendl;
int mx, my;
mx = e->x();
my = e->y();
if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) {
int diffx = _mouseStartPosX-mx;
int diffy = _mouseStartPosY-my;
-#if 0
- QScrollBar*xbar = horizontalScrollBar();
- QScrollBar*ybar = verticalScrollBar();
- if (xbar->value()+diffx>xbar->maxValue()) {
- diffx = xbar->maxValue()-xbar->value();
- } else if (xbar->value()+diffx<0) {
- diffx=0-xbar->value();
- }
- if (ybar->value()+diffy>ybar->maxValue()) {
- diffy = ybar->maxValue()-ybar->value();
- } else if (ybar->value()+diffy<0) {
- diffy=0-ybar->value();
- }
-#endif
scrollBy(diffx,diffy);
}
_mouseStartPosX=mx;
_mouseStartPosY=my;
}
void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e)
{
odebug << " X and Y " << e->x() << " " << e->y() << oendl;
/* this marks the beginning of a possible mouse move. Due internal reasons of QT
the geometry values here may real differ from that set in MoveEvent (I don't know
why). For getting them in real context, we use the first move-event to set the start
position ;)
*/
_mouseStartPosX = -1;
_mouseStartPosY = -1;
}
void OImageScrollView::setDestructiveClose() {
WFlags fl = getWFlags();
/* clear it just in case */
fl &= ~WDestructiveClose;
fl |= WDestructiveClose;
setWFlags( fl );
}
bool OImageScrollView::image_fit_into(const QSize&s )
{
if (s.width()>width()||s.height()>height()) {
return false;
}
return true;