summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiemm/oimagescrollview.cpp48
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
@@ -25,73 +25,73 @@ OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f
25 m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") 25 m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("")
26{ 26{
27 _zoomer = 0; 27 _zoomer = 0;
28 m_states[AUTO_SCALE]=true; 28 m_states[AUTO_SCALE]=true;
29 m_states[AUTO_ROTATE]=true; 29 m_states[AUTO_ROTATE]=true;
30 m_states[FIRST_RESIZE_DONE]=false; 30 m_states[FIRST_RESIZE_DONE]=false;
31 m_states[IMAGE_IS_JPEG]=false; 31 m_states[IMAGE_IS_JPEG]=false;
32 m_states[IMAGE_SCALED_LOADED]=false; 32 m_states[IMAGE_SCALED_LOADED]=false;
33 m_states[SHOW_ZOOMER]=true; 33 m_states[SHOW_ZOOMER]=true;
34 init(); 34 init();
35} 35}
36 36
37OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) 37OImageScrollView::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
53OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) 53OImageScrollView::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
68void OImageScrollView::setImage(const QImage&img) 68void 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
82void OImageScrollView::loadJpeg(bool interncall) 82void 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 );
86 QString param; 86 QString param;
87 bool real_load = false; 87 bool real_load = false;
88 if (AutoScale()) { 88 if (AutoScale()) {
89 if (!interncall) { 89 if (!interncall) {
90 int wid, hei; 90 int wid, hei;
91 wid = QApplication::desktop()->width(); 91 wid = QApplication::desktop()->width();
92 hei = QApplication::desktop()->height(); 92 hei = QApplication::desktop()->height();
93 if (hei>wid) { 93 if (hei>wid) {
94 wid = hei; 94 wid = hei;
95 } else { 95 } else {
96 hei = wid; 96 hei = wid;
97 } 97 }
@@ -106,49 +106,49 @@ void OImageScrollView::loadJpeg(bool interncall)
106 odebug << "Load jpeg unscaled" << oendl; 106 odebug << "Load jpeg unscaled" << oendl;
107 real_load = true; 107 real_load = true;
108 } 108 }
109 setImageScaledLoaded(false); 109 setImageScaledLoaded(false);
110 } 110 }
111 if (real_load) { 111 if (real_load) {
112 _original_data = iio.read() ? iio.image() : QImage(); 112 _original_data = iio.read() ? iio.image() : QImage();
113 } 113 }
114} 114}
115 115
116void OImageScrollView::setImage( const QString& path ) { 116void OImageScrollView::setImage( const QString& path ) {
117 odebug << "load new image " << oendl; 117 odebug << "load new image " << oendl;
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 */
140void OImageScrollView::init() 140void OImageScrollView::init()
141{ 141{
142 odebug << "init " << oendl; 142 odebug << "init " << oendl;
143 143
144 /* 144 /*
145 * create the zoomer 145 * create the zoomer
146 * and connect ther various signals 146 * and connect ther various signals
147 */ 147 */
148 _zoomer = new Opie::MM::OImageZoomer( this, "The Zoomer" ); 148 _zoomer = new Opie::MM::OImageZoomer( this, "The Zoomer" );
149 connect(_zoomer, SIGNAL( zoomAreaRel(int,int)), 149 connect(_zoomer, SIGNAL( zoomAreaRel(int,int)),
150 this, SLOT(scrollBy(int,int)) ); 150 this, SLOT(scrollBy(int,int)) );
151 connect(_zoomer, SIGNAL( zoomArea(int,int)), 151 connect(_zoomer, SIGNAL( zoomArea(int,int)),
152 this, SLOT(center(int,int)) ); 152 this, SLOT(center(int,int)) );
153 connect(this,SIGNAL(contentsMoving(int,int)), 153 connect(this,SIGNAL(contentsMoving(int,int)),
154 _zoomer, (SLOT(setVisiblePoint(int,int))) ); 154 _zoomer, (SLOT(setVisiblePoint(int,int))) );
@@ -413,91 +413,77 @@ void OImageScrollView::keyPressEvent(QKeyEvent * e)
413{ 413{
414 if (!e) return; 414 if (!e) return;
415 int dx = horizontalScrollBar()->lineStep(); 415 int dx = horizontalScrollBar()->lineStep();
416 int dy = verticalScrollBar()->lineStep(); 416 int dy = verticalScrollBar()->lineStep();
417 if (e->key()==Qt::Key_Right) { 417 if (e->key()==Qt::Key_Right) {
418 scrollBy(dx,0); 418 scrollBy(dx,0);
419 e->accept(); 419 e->accept();
420 } else if (e->key()==Qt::Key_Left) { 420 } else if (e->key()==Qt::Key_Left) {
421 scrollBy(0-dx,0); 421 scrollBy(0-dx,0);
422 e->accept(); 422 e->accept();
423 } else if (e->key()==Qt::Key_Up) { 423 } else if (e->key()==Qt::Key_Up) {
424 scrollBy(0,0-dy); 424 scrollBy(0,0-dy);
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
435void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) 435void 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
476else {
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! */
483void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) 469void 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);
492 } 478 }
493 _mouseStartPosX=mx; 479 _mouseStartPosX=mx;
494 _mouseStartPosY=my; 480 _mouseStartPosY=my;
495} 481}
496 482
497void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e) 483void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e)
498{ 484{
499 odebug << " X and Y " << e->x() << " " << e->y() << oendl; 485 odebug << " X and Y " << e->x() << " " << e->y() << oendl;
500 /* this marks the beginning of a possible mouse move. Due internal reasons of QT 486 /* this marks the beginning of a possible mouse move. Due internal reasons of QT
501 the geometry values here may real differ from that set in MoveEvent (I don't know 487 the geometry values here may real differ from that set in MoveEvent (I don't know
502 why). For getting them in real context, we use the first move-event to set the start 488 why). For getting them in real context, we use the first move-event to set the start
503 position ;) 489 position ;)