summaryrefslogtreecommitdiff
path: root/libopie2/opiemm/oimagescrollview.cpp
Unidiff
Diffstat (limited to 'libopie2/opiemm/oimagescrollview.cpp') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiemm/oimagescrollview.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/libopie2/opiemm/oimagescrollview.cpp b/libopie2/opiemm/oimagescrollview.cpp
index 37a1ad5..58a9748 100644
--- a/libopie2/opiemm/oimagescrollview.cpp
+++ b/libopie2/opiemm/oimagescrollview.cpp
@@ -23,78 +23,83 @@ namespace Opie {
23namespace MM { 23namespace MM {
24OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f ) 24OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f )
25 :QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(), 25 :QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(),
26 m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") 26 m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("")
27{ 27{
28 _zoomer = 0; 28 _zoomer = 0;
29 m_states[AUTO_SCALE]=true; 29 m_states[AUTO_SCALE]=true;
30 m_states[AUTO_ROTATE]=true; 30 m_states[AUTO_ROTATE]=true;
31 m_states[FIRST_RESIZE_DONE]=false; 31 m_states[FIRST_RESIZE_DONE]=false;
32 m_states[IMAGE_IS_JPEG]=false; 32 m_states[IMAGE_IS_JPEG]=false;
33 m_states[IMAGE_SCALED_LOADED]=false; 33 m_states[IMAGE_SCALED_LOADED]=false;
34 m_states[SHOW_ZOOMER]=true; 34 m_states[SHOW_ZOOMER]=true;
35 _newImage = true;
35 init(); 36 init();
36} 37}
37 38
38OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) 39OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit)
39 :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img), 40 :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img),
40 m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") 41 m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("")
41{ 42{
42 _zoomer = 0; 43 _zoomer = 0;
43 m_states[AUTO_SCALE]=always_scale; 44 m_states[AUTO_SCALE]=always_scale;
44 m_states[AUTO_ROTATE]=rfit; 45 m_states[AUTO_ROTATE]=rfit;
45 m_states[FIRST_RESIZE_DONE]=false; 46 m_states[FIRST_RESIZE_DONE]=false;
46 m_states[IMAGE_IS_JPEG]=false; 47 m_states[IMAGE_IS_JPEG]=false;
47 m_states[IMAGE_SCALED_LOADED]=false; 48 m_states[IMAGE_SCALED_LOADED]=false;
48 m_states[SHOW_ZOOMER]=true; 49 m_states[SHOW_ZOOMER]=true;
49 _original_data.convertDepth(QPixmap::defaultDepth()); 50 _original_data.convertDepth(QPixmap::defaultDepth());
50 _original_data.setAlphaBuffer(false); 51 _original_data.setAlphaBuffer(false);
52 _newImage = true;
51 init(); 53 init();
52} 54}
53 55
54OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) 56OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit)
55 :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") 57 :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("")
56{ 58{
57 _zoomer = 0; 59 _zoomer = 0;
58 m_states.resize(SCROLLVIEW_BITSET_SIZE); 60 m_states.resize(SCROLLVIEW_BITSET_SIZE);
59 m_states[AUTO_SCALE]=always_scale; 61 m_states[AUTO_SCALE]=always_scale;
60 m_states[AUTO_ROTATE]=rfit; 62 m_states[AUTO_ROTATE]=rfit;
61 m_states[FIRST_RESIZE_DONE]=false; 63 m_states[FIRST_RESIZE_DONE]=false;
62 m_states[IMAGE_IS_JPEG]=false; 64 m_states[IMAGE_IS_JPEG]=false;
63 m_states[IMAGE_SCALED_LOADED]=false; 65 m_states[IMAGE_SCALED_LOADED]=false;
64 m_states[SHOW_ZOOMER]=true; 66 m_states[SHOW_ZOOMER]=true;
67 _newImage = true;
65 init(); 68 init();
66 setImage(img); 69 setImage(img);
67} 70}
68 71
69void OImageScrollView::setImage(const QImage&img) 72void OImageScrollView::setImage(const QImage&img)
70{ 73{
71 _image_data = QImage(); 74 _image_data = QImage();
72 _original_data=img; 75 _original_data=img;
73 _original_data.convertDepth(QPixmap::defaultDepth()); 76 _original_data.convertDepth(QPixmap::defaultDepth());
74 _original_data.setAlphaBuffer(false); 77 _original_data.setAlphaBuffer(false);
75 m_lastName = ""; 78 m_lastName = "";
76 setImageIsJpeg(false); 79 setImageIsJpeg(false);
77 setImageScaledLoaded(false); 80 setImageScaledLoaded(false);
81 _newImage = true;
78 if (FirstResizeDone()) { 82 if (FirstResizeDone()) {
79 generateImage(); 83 generateImage();
80 } 84 }
81} 85}
82 86
83void OImageScrollView::loadJpeg(bool interncall) 87void OImageScrollView::loadJpeg(bool interncall)
84{ 88{
85 if (m_lastName.isEmpty()) return; 89 if (m_lastName.isEmpty()) return;
86 QImageIO iio( m_lastName, 0l ); 90 QImageIO iio( m_lastName, 0l );
87 QString param; 91 QString param;
88 bool real_load = false; 92 bool real_load = false;
93 _newImage = true;
89 if (AutoScale()) { 94 if (AutoScale()) {
90 if (!interncall) { 95 if (!interncall) {
91 ExifData xf; 96 ExifData xf;
92 bool scanned = xf.scan(m_lastName); 97 bool scanned = xf.scan(m_lastName);
93 int wid, hei; 98 int wid, hei;
94 wid = QApplication::desktop()->width(); 99 wid = QApplication::desktop()->width();
95 hei = QApplication::desktop()->height(); 100 hei = QApplication::desktop()->height();
96 if (hei>wid) { 101 if (hei>wid) {
97 wid = hei; 102 wid = hei;
98 } else { 103 } else {
99 hei = wid; 104 hei = wid;
100 } 105 }
@@ -114,24 +119,25 @@ void OImageScrollView::loadJpeg(bool interncall)
114 } 119 }
115 setImageScaledLoaded(false); 120 setImageScaledLoaded(false);
116 } 121 }
117 if (real_load) { 122 if (real_load) {
118 _original_data = iio.read() ? iio.image() : QImage(); 123 _original_data = iio.read() ? iio.image() : QImage();
119 } 124 }
120} 125}
121 126
122void OImageScrollView::setImage( const QString& path ) { 127void OImageScrollView::setImage( const QString& path ) {
123 odebug << "load new image " << oendl; 128 odebug << "load new image " << oendl;
124 if (m_lastName == path) return; 129 if (m_lastName == path) return;
125 m_lastName = path; 130 m_lastName = path;
131 _newImage = true;
126 _original_data = QImage(); 132 _original_data = QImage();
127 QString itype = QImage::imageFormat(m_lastName); 133 QString itype = QImage::imageFormat(m_lastName);
128 odebug << "Image type = " << itype << oendl; 134 odebug << "Image type = " << itype << oendl;
129 if (itype == "JPEG") { 135 if (itype == "JPEG") {
130 setImageIsJpeg(true); 136 setImageIsJpeg(true);
131 loadJpeg(); 137 loadJpeg();
132 } else { 138 } else {
133 setImageIsJpeg(false); 139 setImageIsJpeg(false);
134 _original_data.load(path); 140 _original_data.load(path);
135 _original_data.convertDepth(QPixmap::defaultDepth()); 141 _original_data.convertDepth(QPixmap::defaultDepth());
136 _original_data.setAlphaBuffer(false); 142 _original_data.setAlphaBuffer(false);
137 } 143 }
@@ -165,24 +171,25 @@ void OImageScrollView::init()
165 171
166 setBackgroundColor(white); 172 setBackgroundColor(white);
167 setFocusPolicy(QWidget::StrongFocus); 173 setFocusPolicy(QWidget::StrongFocus);
168 setImageScaledLoaded(false); 174 setImageScaledLoaded(false);
169 setImageIsJpeg(false); 175 setImageIsJpeg(false);
170 if (FirstResizeDone()) { 176 if (FirstResizeDone()) {
171 m_last_rot = Rotate0; 177 m_last_rot = Rotate0;
172 generateImage(); 178 generateImage();
173 } else if (_original_data.size().isValid()) { 179 } else if (_original_data.size().isValid()) {
174 if (image_fit_into(_original_data.size()) || !ShowZoomer()) _zoomer->hide(); 180 if (image_fit_into(_original_data.size()) || !ShowZoomer()) _zoomer->hide();
175 resizeContents(_original_data.width(),_original_data.height()); 181 resizeContents(_original_data.width(),_original_data.height());
176 } 182 }
183 _intensity = 0;
177} 184}
178 185
179void OImageScrollView::setAutoRotate(bool how) 186void OImageScrollView::setAutoRotate(bool how)
180{ 187{
181 /* to avoid double repaints */ 188 /* to avoid double repaints */
182 if (AutoRotate() != how) { 189 if (AutoRotate() != how) {
183 m_states.setBit(AUTO_ROTATE,how); 190 m_states.setBit(AUTO_ROTATE,how);
184 _image_data = QImage(); 191 _image_data = QImage();
185 generateImage(); 192 generateImage();
186 } 193 }
187} 194}
188 195
@@ -331,61 +338,161 @@ void OImageScrollView::rotate_into_data(Rotation r)
331 { 338 {
332 destData = (unsigned char *)dest.scanLine(_original_data.width()-x-1); 339 destData = (unsigned char *)dest.scanLine(_original_data.width()-x-1);
333 destData[y] = srcData[x]; 340 destData[y] = srcData[x];
334 } 341 }
335 } 342 }
336 break; 343 break;
337 default: 344 default:
338 dest = _original_data; 345 dest = _original_data;
339 break; 346 break;
340 } 347 }
341 348
342 } 349 }
350 _newImage = true;
343 _image_data = dest; 351 _image_data = dest;
344} 352}
345 353
354void OImageScrollView::apply_gamma(int aValue)
355{
356 if (!_image_data.size().isValid()) return;
357 float percent = ((float)aValue/100);
358 odebug << "Apply gamma " << percent << oendl;
359 int pixels = _image_data.depth()>8?_image_data.width()*_image_data.height() : _image_data.numColors();
360 int segColors = _image_data.depth() > 8 ? 256 : _image_data.numColors();
361 unsigned char *segTbl = new unsigned char[segColors];
362 bool brighten = (percent >= 0);
363 if ( percent < 0 )
364 percent = -percent;
365
366 unsigned int *data = _image_data.depth() > 8 ? (unsigned int *)_image_data.bits() :
367 (unsigned int *)_image_data.colorTable();
368
369
370 if (brighten) {
371 for ( int i=0; i < segColors; ++i )
372 {
373 int tmp = (int)(i*percent);
374 if ( tmp > 255 )
375 tmp = 255;
376 segTbl[i] = tmp;
377 }
378 } else {
379 for ( int i=0; i < segColors; ++i )
380 {
381 int tmp = (int)(i*percent);
382 if ( tmp < 0 )
383 tmp = 0;
384 segTbl[i] = tmp;
385 }
386 }
387 if (brighten) {
388 for ( int i=0; i < pixels; ++i )
389 {
390 int r = qRed(data[i]);
391 int g = qGreen(data[i]);
392 int b = qBlue(data[i]);
393 int a = qAlpha(data[i]);
394 r = r + segTbl[r] > 255 ? 255 : r + segTbl[r];
395 g = g + segTbl[g] > 255 ? 255 : g + segTbl[g];
396 b = b + segTbl[b] > 255 ? 255 : b + segTbl[b];
397 data[i] = qRgba(r, g, b,a);
398 }
399 } else {
400 for ( int i=0; i < pixels; ++i )
401 {
402 int r = qRed(data[i]);
403 int g = qGreen(data[i]);
404 int b = qBlue(data[i]);
405 int a = qAlpha(data[i]);
406 r = r - segTbl[r] < 0 ? 0 : r - segTbl[r];
407 g = g - segTbl[g] < 0 ? 0 : g - segTbl[g];
408 b = b - segTbl[b] < 0 ? 0 : b - segTbl[b];
409 data[i] = qRgba(r, g, b, a);
410 }
411 }
412 delete [] segTbl;
413}
414
415const int OImageScrollView::Intensity()const
416{
417 return _intensity;
418}
419
420int OImageScrollView::setIntensity(int value,bool reload)
421{
422 int oldi = _intensity;
423 _intensity = value;
424 if (!_pdata.size().isValid()) {
425 return _intensity;
426 }
427
428 if (!reload) {
429 _image_data = _pdata.convertToImage();
430 apply_gamma(_intensity-oldi);
431 _pdata.convertFromImage(_image_data);
432 /*
433 * invalidate
434 */
435 _image_data=QImage();
436 if (isVisible()) {
437 updateContents(contentsX(),contentsY(),width(),height());
438 }
439 } else {
440 _newImage = true;
441 generateImage();
442 }
443 return _intensity;
444}
445
346void OImageScrollView::generateImage() 446void OImageScrollView::generateImage()
347{ 447{
348 Rotation r = Rotate0; 448 Rotation r = Rotate0;
349 _pdata = QPixmap(); 449 _pdata = QPixmap();
350 if (_original_data.isNull()) { 450 if (_original_data.isNull()) {
351 emit imageSizeChanged( _image_data.size() ); 451 emit imageSizeChanged( _image_data.size() );
352 if (_zoomer) _zoomer->setImage( _image_data ); 452 if (_zoomer) _zoomer->setImage( _image_data );
353 return; 453 return;
354 } 454 }
355 if (width()>height()&&_original_data.width()<_original_data.height() || 455 if (width()>height()&&_original_data.width()<_original_data.height() ||
356 width()<height()&&_original_data.width()>_original_data.height()) { 456 width()<height()&&_original_data.width()>_original_data.height()) {
357 if (AutoRotate()) r = Rotate90; 457 if (AutoRotate()) r = Rotate90;
358 } 458 }
359 459
360 int twidth,theight; 460 int twidth,theight;
361 odebug << " r = " << r << oendl; 461 odebug << " r = " << r << oendl;
362 if (AutoScale() && (_original_data.width()>width() || _original_data.height() > height()) ) { 462 if (AutoScale() && (_original_data.width()>width() || _original_data.height() > height()) ) {
363 if (!_image_data.size().isValid()||width()>_image_data.width()||height()>_image_data.height()) { 463 if (!_image_data.size().isValid()||width()>_image_data.width()||height()>_image_data.height()) {
364 odebug << "Rescaling data" << oendl; 464 odebug << "Rescaling data" << oendl;
365 if (r==Rotate0) { 465 if (r==Rotate0) {
366 _image_data = _original_data; 466 _image_data = _original_data;
367 } else { 467 } else {
368 rotate_into_data(r); 468 rotate_into_data(r);
369 } 469 }
470 _newImage = true;
370 } 471 }
371 rescaleImage(width(),height()); 472 rescaleImage(width(),height());
372 } else if (!FirstResizeDone()||r!=m_last_rot||_image_data.width()==0) { 473 } else if (!FirstResizeDone()||r!=m_last_rot||_image_data.width()==0) {
373 if (r==Rotate0) { 474 if (r==Rotate0) {
374 _image_data = _original_data; 475 _image_data = _original_data;
375 } else { 476 } else {
376 rotate_into_data(r); 477 rotate_into_data(r);
377 } 478 }
378 m_last_rot = r; 479 m_last_rot = r;
379 } 480 }
481
482 if (_newImage) {
483 apply_gamma(_intensity);
484 _newImage = false;
485 }
486
380 _pdata.convertFromImage(_image_data); 487 _pdata.convertFromImage(_image_data);
381 twidth = _image_data.width(); 488 twidth = _image_data.width();
382 theight = _image_data.height(); 489 theight = _image_data.height();
383 490
384 /* 491 /*
385 * update the zoomer 492 * update the zoomer
386 */ 493 */
387 check_zoomer(); 494 check_zoomer();
388 emit imageSizeChanged( _image_data.size() ); 495 emit imageSizeChanged( _image_data.size() );
389 rescaleImage( 128, 128 ); 496 rescaleImage( 128, 128 );
390 resizeContents(twidth,theight); 497 resizeContents(twidth,theight);
391 /* 498 /*