author | alwin <alwin> | 2004-04-22 23:48:23 (UTC) |
---|---|---|
committer | alwin <alwin> | 2004-04-22 23:48:23 (UTC) |
commit | ba10e43945b15753e0438cd0176cfa61d61c7391 (patch) (side-by-side diff) | |
tree | 114d7531958a85adc7605e54a0128561f9d4f0eb | |
parent | d93cb43bb2c79a9a8357e195fcdfd8ff140f8a75 (diff) | |
download | opie-ba10e43945b15753e0438cd0176cfa61d61c7391.zip opie-ba10e43945b15753e0438cd0176cfa61d61c7391.tar.gz opie-ba10e43945b15753e0438cd0176cfa61d61c7391.tar.bz2 |
reworked the painting algorithm again, hopefully now it works in all cases
-rw-r--r-- | libopie2/opiemm/oimagescrollview.cpp | 46 |
1 files changed, 16 insertions, 30 deletions
diff --git a/libopie2/opiemm/oimagescrollview.cpp b/libopie2/opiemm/oimagescrollview.cpp index 73df3ff..3f2699a 100644 --- a/libopie2/opiemm/oimagescrollview.cpp +++ b/libopie2/opiemm/oimagescrollview.cpp @@ -25,73 +25,73 @@ OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") { _zoomer = 0; m_states[AUTO_SCALE]=true; m_states[AUTO_ROTATE]=true; m_states[FIRST_RESIZE_DONE]=false; m_states[IMAGE_IS_JPEG]=false; m_states[IMAGE_SCALED_LOADED]=false; m_states[SHOW_ZOOMER]=true; init(); } OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img), m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") { _zoomer = 0; m_states[AUTO_SCALE]=always_scale; m_states[AUTO_ROTATE]=rfit; m_states[FIRST_RESIZE_DONE]=false; m_states[IMAGE_IS_JPEG]=false; m_states[IMAGE_SCALED_LOADED]=false; m_states[SHOW_ZOOMER]=true; _original_data.convertDepth(QPixmap::defaultDepth()); - _original_data.setAlphaBuffer(false); + //_original_data.setAlphaBuffer(false); init(); } OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") { _zoomer = 0; m_states.resize(SCROLLVIEW_BITSET_SIZE); m_states[AUTO_SCALE]=always_scale; m_states[AUTO_ROTATE]=rfit; m_states[FIRST_RESIZE_DONE]=false; m_states[IMAGE_IS_JPEG]=false; m_states[IMAGE_SCALED_LOADED]=false; m_states[SHOW_ZOOMER]=true; init(); setImage(img); } void OImageScrollView::setImage(const QImage&img) { _image_data = QImage(); _original_data=img; _original_data.convertDepth(QPixmap::defaultDepth()); - _original_data.setAlphaBuffer(false); + //_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; } @@ -106,49 +106,49 @@ void OImageScrollView::loadJpeg(bool interncall) odebug << "Load jpeg unscaled" << oendl; real_load = true; } setImageScaledLoaded(false); } if (real_load) { _original_data = iio.read() ? iio.image() : QImage(); } } 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 { setImageIsJpeg(false); _original_data.load(path); _original_data.convertDepth(QPixmap::defaultDepth()); - _original_data.setAlphaBuffer(false); + //_original_data.setAlphaBuffer(false); } _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))) ); @@ -413,91 +413,77 @@ void OImageScrollView::keyPressEvent(QKeyEvent * e) { if (!e) return; int dx = horizontalScrollBar()->lineStep(); int dy = verticalScrollBar()->lineStep(); if (e->key()==Qt::Key_Right) { scrollBy(dx,0); e->accept(); } else if (e->key()==Qt::Key_Left) { scrollBy(0-dx,0); e->accept(); } else if (e->key()==Qt::Key_Up) { scrollBy(0,0-dy); e->accept(); } else if (e->key()==Qt::Key_Down) { scrollBy(0,dy); e->accept(); } else { e->ignore(); } QScrollView::keyPressEvent(e); } void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) { + if (!_pdata.size().isValid()) { + p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); + return; + } + int w = clipw; int h = cliph; int x = clipx; int y = clipy; bool erase = false; - if (!_pdata.size().isValid()) { - p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); - return; - } - if (w>_pdata.width()) { - w=_pdata.width(); - x = 0; + w = _pdata.width()-x; erase = true; - } else if (x+w>_pdata.width()){ - x = _pdata.width()-w; } - if (h>_pdata.height()) { - h=_pdata.height(); - y = 0; + h = _pdata.height()-y; erase = true; - } else if (y+h>_pdata.height()){ - y = _pdata.height()-h; } - - if (erase||_original_data.hasAlphaBuffer()||clipy>_pdata.height()||clipx>_pdata.width()) { - odebug << QSize(clipx,clipy) << " # " << QSize(clipw,cliph) << oendl; + if (!erase && (clipy+cliph>_pdata.height()||clipx+clipw>_pdata.width())) { + erase = true; + } + if (erase||_original_data.hasAlphaBuffer()) { p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); } - odebug << QSize(x,y) << " - " << QSize(w,h) << oendl; - if (clipy<=_pdata.height()&&clipx<=_pdata.width()) { -#if 0 - odebug << "painting image content" << oendl; -#endif + if (w>0 && h>0&&x<_pdata.width()&&y<_pdata.height()) { + odebug << "Drawing pixmap" << oendl; p->drawPixmap(clipx,clipy,_pdata,x,y,w,h); } -#if 0 -else { - odebug << "not painting image content" << oendl; - } -#endif } /* using the real geometry points and not the translated points is wanted! */ void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) { int mx, my; mx = e->x(); my = e->y(); if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { int diffx = _mouseStartPosX-mx; int diffy = _mouseStartPosY-my; 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 ;) |