-rw-r--r-- | libopie2/opiemm/oimagescrollview.cpp | 107 | ||||
-rw-r--r-- | libopie2/opiemm/oimagescrollview.h | 16 |
2 files changed, 123 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 | |||
@@ -32,6 +32,7 @@ OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f | |||
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 | ||
@@ -48,6 +49,7 @@ OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const ch | |||
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 | ||
@@ -62,6 +64,7 @@ OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const c | |||
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 | } |
@@ -75,6 +78,7 @@ void OImageScrollView::setImage(const QImage&img) | |||
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 | } |
@@ -86,6 +90,7 @@ void OImageScrollView::loadJpeg(bool interncall) | |||
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; |
@@ -123,6 +128,7 @@ void 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; |
@@ -174,6 +180,7 @@ void OImageScrollView::init() | |||
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 | ||
179 | void OImageScrollView::setAutoRotate(bool how) | 186 | void OImageScrollView::setAutoRotate(bool how) |
@@ -340,9 +347,102 @@ void OImageScrollView::rotate_into_data(Rotation r) | |||
340 | } | 347 | } |
341 | 348 | ||
342 | } | 349 | } |
350 | _newImage = true; | ||
343 | _image_data = dest; | 351 | _image_data = dest; |
344 | } | 352 | } |
345 | 353 | ||
354 | void 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 | |||
415 | const int OImageScrollView::Intensity()const | ||
416 | { | ||
417 | return _intensity; | ||
418 | } | ||
419 | |||
420 | int 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 | |||
346 | void OImageScrollView::generateImage() | 446 | void OImageScrollView::generateImage() |
347 | { | 447 | { |
348 | Rotation r = Rotate0; | 448 | Rotation r = Rotate0; |
@@ -367,6 +467,7 @@ void OImageScrollView::generateImage() | |||
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) { |
@@ -377,6 +478,12 @@ void OImageScrollView::generateImage() | |||
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(); |
diff --git a/libopie2/opiemm/oimagescrollview.h b/libopie2/opiemm/oimagescrollview.h index 01a2d56..11964fd 100644 --- a/libopie2/opiemm/oimagescrollview.h +++ b/libopie2/opiemm/oimagescrollview.h | |||
@@ -121,6 +121,19 @@ public: | |||
121 | */ | 121 | */ |
122 | virtual bool ShowZoomer()const; | 122 | virtual bool ShowZoomer()const; |
123 | 123 | ||
124 | /** | ||
125 | * set a display intensity | ||
126 | * @param value the intensity value, will calcuated to a percent value (value/100) | ||
127 | * @param reload should the real image recalculated complete or just work on current display. | ||
128 | * @return the new intensity | ||
129 | */ | ||
130 | virtual int setIntensity(int value,bool reload=false); | ||
131 | /** | ||
132 | * return the current display intensity | ||
133 | */ | ||
134 | virtual const int Intensity()const; | ||
135 | |||
136 | |||
124 | public slots: | 137 | public slots: |
125 | /** | 138 | /** |
126 | * Displays a new image, calculations will made immediately. | 139 | * Displays a new image, calculations will made immediately. |
@@ -157,6 +170,8 @@ protected: | |||
157 | QImage _image_data; | 170 | QImage _image_data; |
158 | QImage _original_data; | 171 | QImage _original_data; |
159 | QPixmap _pdata; | 172 | QPixmap _pdata; |
173 | int _intensity; | ||
174 | bool _newImage; | ||
160 | 175 | ||
161 | int _mouseStartPosX,_mouseStartPosY; | 176 | int _mouseStartPosX,_mouseStartPosY; |
162 | 177 | ||
@@ -179,6 +194,7 @@ protected: | |||
179 | virtual void setImageScaledLoaded(bool how); | 194 | virtual void setImageScaledLoaded(bool how); |
180 | virtual bool FirstResizeDone()const; | 195 | virtual bool FirstResizeDone()const; |
181 | virtual void setFirstResizeDone(bool how); | 196 | virtual void setFirstResizeDone(bool how); |
197 | virtual void apply_gamma(int aValue); | ||
182 | 198 | ||
183 | protected slots: | 199 | protected slots: |
184 | virtual void viewportMouseMoveEvent(QMouseEvent* e); | 200 | virtual void viewportMouseMoveEvent(QMouseEvent* e); |