summaryrefslogtreecommitdiff
authoralwin <alwin>2004-04-22 23:48:23 (UTC)
committer alwin <alwin>2004-04-22 23:48:23 (UTC)
commitba10e43945b15753e0438cd0176cfa61d61c7391 (patch) (side-by-side diff)
tree114d7531958a85adc7605e54a0128561f9d4f0eb
parentd93cb43bb2c79a9a8357e195fcdfd8ff140f8a75 (diff)
downloadopie-ba10e43945b15753e0438cd0176cfa61d61c7391.zip
opie-ba10e43945b15753e0438cd0176cfa61d61c7391.tar.gz
opie-ba10e43945b15753e0438cd0176cfa61d61c7391.tar.bz2
reworked the painting algorithm again, hopefully now it works in all cases
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiemm/oimagescrollview.cpp46
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 ;)