author | alwin <alwin> | 2004-04-22 23:48:23 (UTC) |
---|---|---|
committer | alwin <alwin> | 2004-04-22 23:48:23 (UTC) |
commit | ba10e43945b15753e0438cd0176cfa61d61c7391 (patch) (unidiff) | |
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 | 48 |
1 files changed, 17 insertions, 31 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 | |||
@@ -37,49 +37,49 @@ OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f | |||
37 | OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) | 37 | OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) |
38 | :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img), | 38 | :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img), |
39 | m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") | 39 | m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") |
40 | { | 40 | { |
41 | _zoomer = 0; | 41 | _zoomer = 0; |
42 | m_states[AUTO_SCALE]=always_scale; | 42 | m_states[AUTO_SCALE]=always_scale; |
43 | m_states[AUTO_ROTATE]=rfit; | 43 | m_states[AUTO_ROTATE]=rfit; |
44 | m_states[FIRST_RESIZE_DONE]=false; | 44 | m_states[FIRST_RESIZE_DONE]=false; |
45 | m_states[IMAGE_IS_JPEG]=false; | 45 | m_states[IMAGE_IS_JPEG]=false; |
46 | m_states[IMAGE_SCALED_LOADED]=false; | 46 | m_states[IMAGE_SCALED_LOADED]=false; |
47 | m_states[SHOW_ZOOMER]=true; | 47 | m_states[SHOW_ZOOMER]=true; |
48 | _original_data.convertDepth(QPixmap::defaultDepth()); | 48 | _original_data.convertDepth(QPixmap::defaultDepth()); |
49 | _original_data.setAlphaBuffer(false); | 49 | //_original_data.setAlphaBuffer(false); |
50 | init(); | 50 | init(); |
51 | } | 51 | } |
52 | 52 | ||
53 | OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) | 53 | OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) |
54 | :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") | 54 | :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") |
55 | { | 55 | { |
56 | _zoomer = 0; | 56 | _zoomer = 0; |
57 | m_states.resize(SCROLLVIEW_BITSET_SIZE); | 57 | m_states.resize(SCROLLVIEW_BITSET_SIZE); |
58 | m_states[AUTO_SCALE]=always_scale; | 58 | m_states[AUTO_SCALE]=always_scale; |
59 | m_states[AUTO_ROTATE]=rfit; | 59 | m_states[AUTO_ROTATE]=rfit; |
60 | m_states[FIRST_RESIZE_DONE]=false; | 60 | m_states[FIRST_RESIZE_DONE]=false; |
61 | m_states[IMAGE_IS_JPEG]=false; | 61 | m_states[IMAGE_IS_JPEG]=false; |
62 | m_states[IMAGE_SCALED_LOADED]=false; | 62 | m_states[IMAGE_SCALED_LOADED]=false; |
63 | m_states[SHOW_ZOOMER]=true; | 63 | m_states[SHOW_ZOOMER]=true; |
64 | init(); | 64 | init(); |
65 | setImage(img); | 65 | setImage(img); |
66 | } | 66 | } |
67 | 67 | ||
68 | void OImageScrollView::setImage(const QImage&img) | 68 | void OImageScrollView::setImage(const QImage&img) |
69 | { | 69 | { |
70 | _image_data = QImage(); | 70 | _image_data = QImage(); |
71 | _original_data=img; | 71 | _original_data=img; |
72 | _original_data.convertDepth(QPixmap::defaultDepth()); | 72 | _original_data.convertDepth(QPixmap::defaultDepth()); |
73 | _original_data.setAlphaBuffer(false); | 73 | //_original_data.setAlphaBuffer(false); |
74 | m_lastName = ""; | 74 | m_lastName = ""; |
75 | setImageIsJpeg(false); | 75 | setImageIsJpeg(false); |
76 | setImageScaledLoaded(false); | 76 | setImageScaledLoaded(false); |
77 | if (FirstResizeDone()) { | 77 | if (FirstResizeDone()) { |
78 | generateImage(); | 78 | generateImage(); |
79 | } | 79 | } |
80 | } | 80 | } |
81 | 81 | ||
82 | void OImageScrollView::loadJpeg(bool interncall) | 82 | void OImageScrollView::loadJpeg(bool interncall) |
83 | { | 83 | { |
84 | if (m_lastName.isEmpty()) return; | 84 | if (m_lastName.isEmpty()) return; |
85 | QImageIO iio( m_lastName, 0l ); | 85 | QImageIO iio( m_lastName, 0l ); |
@@ -118,25 +118,25 @@ void OImageScrollView::setImage( const QString& path ) { | |||
118 | if (m_lastName == path) return; | 118 | if (m_lastName == path) return; |
119 | m_lastName = path; | 119 | m_lastName = path; |
120 | _original_data = QImage(); | 120 | _original_data = QImage(); |
121 | QString itype = QImage::imageFormat(m_lastName); | 121 | QString itype = QImage::imageFormat(m_lastName); |
122 | odebug << "Image type = " << itype << oendl; | 122 | odebug << "Image type = " << itype << oendl; |
123 | if (itype == "JPEG") { | 123 | if (itype == "JPEG") { |
124 | setImageIsJpeg(true); | 124 | setImageIsJpeg(true); |
125 | loadJpeg(); | 125 | loadJpeg(); |
126 | } else { | 126 | } else { |
127 | setImageIsJpeg(false); | 127 | setImageIsJpeg(false); |
128 | _original_data.load(path); | 128 | _original_data.load(path); |
129 | _original_data.convertDepth(QPixmap::defaultDepth()); | 129 | _original_data.convertDepth(QPixmap::defaultDepth()); |
130 | _original_data.setAlphaBuffer(false); | 130 | //_original_data.setAlphaBuffer(false); |
131 | } | 131 | } |
132 | _image_data = QImage(); | 132 | _image_data = QImage(); |
133 | if (FirstResizeDone()) { | 133 | if (FirstResizeDone()) { |
134 | generateImage(); | 134 | generateImage(); |
135 | if (isVisible()) viewport()->repaint(true); | 135 | if (isVisible()) viewport()->repaint(true); |
136 | } | 136 | } |
137 | } | 137 | } |
138 | 138 | ||
139 | /* should be called every time the QImage changed it content */ | 139 | /* should be called every time the QImage changed it content */ |
140 | void OImageScrollView::init() | 140 | void OImageScrollView::init() |
141 | { | 141 | { |
142 | odebug << "init " << oendl; | 142 | odebug << "init " << oendl; |
@@ -425,67 +425,53 @@ void OImageScrollView::keyPressEvent(QKeyEvent * e) | |||
425 | e->accept(); | 425 | e->accept(); |
426 | } else if (e->key()==Qt::Key_Down) { | 426 | } else if (e->key()==Qt::Key_Down) { |
427 | scrollBy(0,dy); | 427 | scrollBy(0,dy); |
428 | e->accept(); | 428 | e->accept(); |
429 | } else { | 429 | } else { |
430 | e->ignore(); | 430 | e->ignore(); |
431 | } | 431 | } |
432 | QScrollView::keyPressEvent(e); | 432 | QScrollView::keyPressEvent(e); |
433 | } | 433 | } |
434 | 434 | ||
435 | void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) | 435 | void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) |
436 | { | 436 | { |
437 | if (!_pdata.size().isValid()) { | ||
438 | p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); | ||
439 | return; | ||
440 | } | ||
441 | |||
437 | int w = clipw; | 442 | int w = clipw; |
438 | int h = cliph; | 443 | int h = cliph; |
439 | int x = clipx; | 444 | int x = clipx; |
440 | int y = clipy; | 445 | int y = clipy; |
441 | bool erase = false; | 446 | bool erase = false; |
442 | 447 | ||
443 | if (!_pdata.size().isValid()) { | ||
444 | p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); | ||
445 | return; | ||
446 | } | ||
447 | |||
448 | if (w>_pdata.width()) { | 448 | if (w>_pdata.width()) { |
449 | w=_pdata.width(); | 449 | w = _pdata.width()-x; |
450 | x = 0; | 450 | erase=true; |
451 | erase = true; | ||
452 | } else if (x+w>_pdata.width()){ | ||
453 | x = _pdata.width()-w; | ||
454 | } | 451 | } |
455 | |||
456 | if (h>_pdata.height()) { | 452 | if (h>_pdata.height()) { |
457 | h=_pdata.height(); | 453 | h = _pdata.height()-y; |
458 | y = 0; | 454 | erase=true; |
455 | } | ||
456 | if (!erase && (clipy+cliph>_pdata.height()||clipx+clipw>_pdata.width())) { | ||
459 | erase = true; | 457 | erase = true; |
460 | } else if (y+h>_pdata.height()){ | ||
461 | y = _pdata.height()-h; | ||
462 | } | 458 | } |
463 | 459 | if (erase||_original_data.hasAlphaBuffer()) { | |
464 | if (erase||_original_data.hasAlphaBuffer()||clipy>_pdata.height()||clipx>_pdata.width()) { | ||
465 | odebug << QSize(clipx,clipy) << " # " << QSize(clipw,cliph) << oendl; | ||
466 | p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); | 460 | p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); |
467 | } | 461 | } |
468 | odebug << QSize(x,y) << " - " << QSize(w,h) << oendl; | 462 | if (w>0 && h>0&&x<_pdata.width()&&y<_pdata.height()) { |
469 | if (clipy<=_pdata.height()&&clipx<=_pdata.width()) { | 463 | odebug << "Drawing pixmap" << oendl; |
470 | #if 0 | ||
471 | odebug << "painting image content" << oendl; | ||
472 | #endif | ||
473 | p->drawPixmap(clipx,clipy,_pdata,x,y,w,h); | 464 | p->drawPixmap(clipx,clipy,_pdata,x,y,w,h); |
474 | } | ||
475 | #if 0 | ||
476 | else { | ||
477 | odebug << "not painting image content" << oendl; | ||
478 | } | 465 | } |
479 | #endif | ||
480 | } | 466 | } |
481 | 467 | ||
482 | /* using the real geometry points and not the translated points is wanted! */ | 468 | /* using the real geometry points and not the translated points is wanted! */ |
483 | void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) | 469 | void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) |
484 | { | 470 | { |
485 | int mx, my; | 471 | int mx, my; |
486 | mx = e->x(); | 472 | mx = e->x(); |
487 | my = e->y(); | 473 | my = e->y(); |
488 | if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { | 474 | if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { |
489 | int diffx = _mouseStartPosX-mx; | 475 | int diffx = _mouseStartPosX-mx; |
490 | int diffy = _mouseStartPosY-my; | 476 | int diffy = _mouseStartPosY-my; |
491 | scrollBy(diffx,diffy); | 477 | scrollBy(diffx,diffy); |