summaryrefslogtreecommitdiff
authoralwin <alwin>2004-04-23 13:23:42 (UTC)
committer alwin <alwin>2004-04-23 13:23:42 (UTC)
commit25f3f2fe15578fd4deb04a951e3e23927977e032 (patch) (unidiff)
tree3768cf6f77f04c852caabb22e332f3e070709903
parentda6a98dbc555018a29bf140ed8e890015240b322 (diff)
downloadopie-25f3f2fe15578fd4deb04a951e3e23927977e032.zip
opie-25f3f2fe15578fd4deb04a951e3e23927977e032.tar.gz
opie-25f3f2fe15578fd4deb04a951e3e23927977e032.tar.bz2
reduced the need of image calculations
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiemm/oimagescrollview.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/libopie2/opiemm/oimagescrollview.cpp b/libopie2/opiemm/oimagescrollview.cpp
index 3f2699a..72248c1 100644
--- a/libopie2/opiemm/oimagescrollview.cpp
+++ b/libopie2/opiemm/oimagescrollview.cpp
@@ -1,563 +1,564 @@
1#include "oimagescrollview.h" 1#include "oimagescrollview.h"
2 2
3#include <opie2/oimagezoomer.h> 3#include <opie2/oimagezoomer.h>
4#include <opie2/odebug.h> 4#include <opie2/odebug.h>
5#include <opie2/oapplication.h> 5#include <opie2/oapplication.h>
6#include <opie2/owait.h> 6#include <opie2/owait.h>
7 7
8#include <qimage.h> 8#include <qimage.h>
9#include <qlayout.h> 9#include <qlayout.h>
10 10
11/* for usage with the bitset */ 11/* for usage with the bitset */
12#define AUTO_SCALE 0 12#define AUTO_SCALE 0
13#define AUTO_ROTATE 1 13#define AUTO_ROTATE 1
14#define SHOW_ZOOMER 2 14#define SHOW_ZOOMER 2
15#define FIRST_RESIZE_DONE 3 15#define FIRST_RESIZE_DONE 3
16#define IMAGE_IS_JPEG 4 16#define IMAGE_IS_JPEG 4
17#define IMAGE_SCALED_LOADED 5 17#define IMAGE_SCALED_LOADED 5
18 18
19#define SCROLLVIEW_BITSET_SIZE 6 19#define SCROLLVIEW_BITSET_SIZE 6
20 20
21namespace Opie { 21namespace Opie {
22namespace MM { 22namespace MM {
23OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f ) 23OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f )
24 :QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(), 24 :QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(),
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 }
98 param = QString( "Fast Shrink( 3 ) Scale( %1, %2, ScaleMin)" ).arg( wid ).arg( hei ); 98 param = QString( "Fast Shrink( 3 ) Scale( %1, %2, ScaleMin)" ).arg( wid ).arg( hei );
99 odebug << "Load jpeg scaled \"" << param << "\"" << oendl; 99 odebug << "Load jpeg scaled \"" << param << "\"" << oendl;
100 iio.setParameters(param.latin1()); 100 iio.setParameters(param.latin1());
101 setImageScaledLoaded(true); 101 setImageScaledLoaded(true);
102 real_load = true; 102 real_load = true;
103 } 103 }
104 } else { 104 } else {
105 if (ImageScaledLoaded()||!interncall) { 105 if (ImageScaledLoaded()||!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))) );
155 connect(this,SIGNAL(imageSizeChanged(const QSize&)), 155 connect(this,SIGNAL(imageSizeChanged(const QSize&)),
156 _zoomer, SLOT(setImageSize(const QSize&)) ); 156 _zoomer, SLOT(setImageSize(const QSize&)) );
157 connect(this,SIGNAL(viewportSizeChanged(const QSize&)), 157 connect(this,SIGNAL(viewportSizeChanged(const QSize&)),
158 _zoomer, SLOT(setViewPortSize(const QSize&)) ); 158 _zoomer, SLOT(setViewPortSize(const QSize&)) );
159 159
160 setBackgroundColor(white); 160 setBackgroundColor(white);
161 setFocusPolicy(QWidget::StrongFocus); 161 setFocusPolicy(QWidget::StrongFocus);
162 setImageScaledLoaded(false); 162 setImageScaledLoaded(false);
163 setImageIsJpeg(false); 163 setImageIsJpeg(false);
164 if (FirstResizeDone()) { 164 if (FirstResizeDone()) {
165 m_last_rot = Rotate0; 165 m_last_rot = Rotate0;
166 generateImage(); 166 generateImage();
167 } else if (_original_data.size().isValid()) { 167 } else if (_original_data.size().isValid()) {
168 if (image_fit_into(_original_data.size()) || !ShowZoomer()) _zoomer->hide(); 168 if (image_fit_into(_original_data.size()) || !ShowZoomer()) _zoomer->hide();
169 resizeContents(_original_data.width(),_original_data.height()); 169 resizeContents(_original_data.width(),_original_data.height());
170 } 170 }
171} 171}
172 172
173void OImageScrollView::setAutoRotate(bool how) 173void OImageScrollView::setAutoRotate(bool how)
174{ 174{
175 /* to avoid double repaints */ 175 /* to avoid double repaints */
176 if (AutoRotate() != how) { 176 if (AutoRotate() != how) {
177 m_states.setBit(AUTO_ROTATE,how); 177 m_states.setBit(AUTO_ROTATE,how);
178 _image_data = QImage(); 178 _image_data = QImage();
179 generateImage(); 179 generateImage();
180 } 180 }
181} 181}
182 182
183bool OImageScrollView::AutoRotate()const 183bool OImageScrollView::AutoRotate()const
184{ 184{
185 return m_states.testBit(AUTO_ROTATE); 185 return m_states.testBit(AUTO_ROTATE);
186} 186}
187 187
188void OImageScrollView::setAutoScaleRotate(bool scale, bool rotate) 188void OImageScrollView::setAutoScaleRotate(bool scale, bool rotate)
189{ 189{
190 m_states.setBit(AUTO_ROTATE,rotate); 190 m_states.setBit(AUTO_ROTATE,rotate);
191 setAutoScale(scale); 191 setAutoScale(scale);
192} 192}
193 193
194void OImageScrollView::setAutoScale(bool how) 194void OImageScrollView::setAutoScale(bool how)
195{ 195{
196 m_states.setBit(AUTO_SCALE,how); 196 m_states.setBit(AUTO_SCALE,how);
197 _image_data = QImage(); 197 _image_data = QImage();
198 if (ImageIsJpeg() && how == false && ImageScaledLoaded()==true) { 198 if (ImageIsJpeg() && how == false && ImageScaledLoaded()==true) {
199 loadJpeg(true); 199 loadJpeg(true);
200 } 200 }
201 generateImage(); 201 generateImage();
202} 202}
203 203
204bool OImageScrollView::AutoScale()const 204bool OImageScrollView::AutoScale()const
205{ 205{
206 return m_states.testBit(AUTO_SCALE); 206 return m_states.testBit(AUTO_SCALE);
207} 207}
208 208
209OImageScrollView::~OImageScrollView() 209OImageScrollView::~OImageScrollView()
210{ 210{
211} 211}
212 212
213void OImageScrollView::rescaleImage(int w, int h) 213void OImageScrollView::rescaleImage(int w, int h)
214{ 214{
215 if (_image_data.width()==w && _image_data.height()==h) { 215 if (_image_data.width()==w && _image_data.height()==h) {
216 return; 216 return;
217 } 217 }
218 double hs = (double)h / (double)_image_data.height() ; 218 double hs = (double)h / (double)_image_data.height() ;
219 double ws = (double)w / (double)_image_data.width() ; 219 double ws = (double)w / (double)_image_data.width() ;
220 double scaleFactor = (hs > ws) ? ws : hs; 220 double scaleFactor = (hs > ws) ? ws : hs;
221 int smoothW = (int)(scaleFactor * _image_data.width()); 221 int smoothW = (int)(scaleFactor * _image_data.width());
222 int smoothH = (int)(scaleFactor * _image_data.height()); 222 int smoothH = (int)(scaleFactor * _image_data.height());
223 _image_data = _image_data.smoothScale(smoothW,smoothH); 223 _image_data = _image_data.smoothScale(smoothW,smoothH);
224} 224}
225 225
226void OImageScrollView::rotate_into_data(Rotation r) 226void OImageScrollView::rotate_into_data(Rotation r)
227{ 227{
228 /* realy - we must do this that way, 'cause when acting direct on _image_data the app will 228 /* realy - we must do this that way, 'cause when acting direct on _image_data the app will
229 segfault :( */ 229 segfault :( */
230 QImage dest; 230 QImage dest;
231 int x, y; 231 int x, y;
232 if ( _original_data.depth() > 8 ) 232 if ( _original_data.depth() > 8 )
233 { 233 {
234 unsigned int *srcData, *destData; 234 unsigned int *srcData, *destData;
235 switch ( r ) 235 switch ( r )
236 { 236 {
237 case Rotate90: 237 case Rotate90:
238 dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); 238 dest.create(_original_data.height(), _original_data.width(), _original_data.depth());
239 for ( y=0; y < _original_data.height(); ++y ) 239 for ( y=0; y < _original_data.height(); ++y )
240 { 240 {
241 srcData = (unsigned int *)_original_data.scanLine(y); 241 srcData = (unsigned int *)_original_data.scanLine(y);
242 for ( x=0; x < _original_data.width(); ++x ) 242 for ( x=0; x < _original_data.width(); ++x )
243 { 243 {
244 destData = (unsigned int *)dest.scanLine(x); 244 destData = (unsigned int *)dest.scanLine(x);
245 destData[_original_data.height()-y-1] = srcData[x]; 245 destData[_original_data.height()-y-1] = srcData[x];
246 } 246 }
247 } 247 }
248 break; 248 break;
249 case Rotate180: 249 case Rotate180:
250 dest.create(_original_data.width(), _original_data.height(), _original_data.depth()); 250 dest.create(_original_data.width(), _original_data.height(), _original_data.depth());
251 for ( y=0; y < _original_data.height(); ++y ) 251 for ( y=0; y < _original_data.height(); ++y )
252 { 252 {
253 srcData = (unsigned int *)_original_data.scanLine(y); 253 srcData = (unsigned int *)_original_data.scanLine(y);
254 destData = (unsigned int *)dest.scanLine(_original_data.height()-y-1); 254 destData = (unsigned int *)dest.scanLine(_original_data.height()-y-1);
255 for ( x=0; x < _original_data.width(); ++x ) 255 for ( x=0; x < _original_data.width(); ++x )
256 destData[_original_data.width()-x-1] = srcData[x]; 256 destData[_original_data.width()-x-1] = srcData[x];
257 } 257 }
258 break; 258 break;
259 case Rotate270: 259 case Rotate270:
260 dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); 260 dest.create(_original_data.height(), _original_data.width(), _original_data.depth());
261 for ( y=0; y < _original_data.height(); ++y ) 261 for ( y=0; y < _original_data.height(); ++y )
262 { 262 {
263 srcData = (unsigned int *)_original_data.scanLine(y); 263 srcData = (unsigned int *)_original_data.scanLine(y);
264 for ( x=0; x < _original_data.width(); ++x ) 264 for ( x=0; x < _original_data.width(); ++x )
265 { 265 {
266 destData = (unsigned int *)dest.scanLine(_original_data.width()-x-1); 266 destData = (unsigned int *)dest.scanLine(_original_data.width()-x-1);
267 destData[y] = srcData[x]; 267 destData[y] = srcData[x];
268 } 268 }
269 } 269 }
270 break; 270 break;
271 default: 271 default:
272 dest = _original_data; 272 dest = _original_data;
273 break; 273 break;
274 } 274 }
275 } 275 }
276 else 276 else
277 { 277 {
278 unsigned char *srcData, *destData; 278 unsigned char *srcData, *destData;
279 unsigned int *srcTable, *destTable; 279 unsigned int *srcTable, *destTable;
280 switch ( r ) 280 switch ( r )
281 { 281 {
282 case Rotate90: 282 case Rotate90:
283 dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); 283 dest.create(_original_data.height(), _original_data.width(), _original_data.depth());
284 dest.setNumColors(_original_data.numColors()); 284 dest.setNumColors(_original_data.numColors());
285 srcTable = (unsigned int *)_original_data.colorTable(); 285 srcTable = (unsigned int *)_original_data.colorTable();
286 destTable = (unsigned int *)dest.colorTable(); 286 destTable = (unsigned int *)dest.colorTable();
287 for ( x=0; x < _original_data.numColors(); ++x ) 287 for ( x=0; x < _original_data.numColors(); ++x )
288 destTable[x] = srcTable[x]; 288 destTable[x] = srcTable[x];
289 for ( y=0; y < _original_data.height(); ++y ) 289 for ( y=0; y < _original_data.height(); ++y )
290 { 290 {
291 srcData = (unsigned char *)_original_data.scanLine(y); 291 srcData = (unsigned char *)_original_data.scanLine(y);
292 for ( x=0; x < _original_data.width(); ++x ) 292 for ( x=0; x < _original_data.width(); ++x )
293 { 293 {
294 destData = (unsigned char *)dest.scanLine(x); 294 destData = (unsigned char *)dest.scanLine(x);
295 destData[_original_data.height()-y-1] = srcData[x]; 295 destData[_original_data.height()-y-1] = srcData[x];
296 } 296 }
297 } 297 }
298 break; 298 break;
299 case Rotate180: 299 case Rotate180:
300 dest.create(_original_data.width(), _original_data.height(), _original_data.depth()); 300 dest.create(_original_data.width(), _original_data.height(), _original_data.depth());
301 dest.setNumColors(_original_data.numColors()); 301 dest.setNumColors(_original_data.numColors());
302 srcTable = (unsigned int *)_original_data.colorTable(); 302 srcTable = (unsigned int *)_original_data.colorTable();
303 destTable = (unsigned int *)dest.colorTable(); 303 destTable = (unsigned int *)dest.colorTable();
304 for ( x=0; x < _original_data.numColors(); ++x ) 304 for ( x=0; x < _original_data.numColors(); ++x )
305 destTable[x] = srcTable[x]; 305 destTable[x] = srcTable[x];
306 for ( y=0; y < _original_data.height(); ++y ) 306 for ( y=0; y < _original_data.height(); ++y )
307 { 307 {
308 srcData = (unsigned char *)_original_data.scanLine(y); 308 srcData = (unsigned char *)_original_data.scanLine(y);
309 destData = (unsigned char *)dest.scanLine(_original_data.height()-y-1); 309 destData = (unsigned char *)dest.scanLine(_original_data.height()-y-1);
310 for ( x=0; x < _original_data.width(); ++x ) 310 for ( x=0; x < _original_data.width(); ++x )
311 destData[_original_data.width()-x-1] = srcData[x]; 311 destData[_original_data.width()-x-1] = srcData[x];
312 } 312 }
313 break; 313 break;
314 case Rotate270: 314 case Rotate270:
315 dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); 315 dest.create(_original_data.height(), _original_data.width(), _original_data.depth());
316 dest.setNumColors(_original_data.numColors()); 316 dest.setNumColors(_original_data.numColors());
317 srcTable = (unsigned int *)_original_data.colorTable(); 317 srcTable = (unsigned int *)_original_data.colorTable();
318 destTable = (unsigned int *)dest.colorTable(); 318 destTable = (unsigned int *)dest.colorTable();
319 for ( x=0; x < _original_data.numColors(); ++x ) 319 for ( x=0; x < _original_data.numColors(); ++x )
320 destTable[x] = srcTable[x]; 320 destTable[x] = srcTable[x];
321 for ( y=0; y < _original_data.height(); ++y ) 321 for ( y=0; y < _original_data.height(); ++y )
322 { 322 {
323 srcData = (unsigned char *)_original_data.scanLine(y); 323 srcData = (unsigned char *)_original_data.scanLine(y);
324 for ( x=0; x < _original_data.width(); ++x ) 324 for ( x=0; x < _original_data.width(); ++x )
325 { 325 {
326 destData = (unsigned char *)dest.scanLine(_original_data.width()-x-1); 326 destData = (unsigned char *)dest.scanLine(_original_data.width()-x-1);
327 destData[y] = srcData[x]; 327 destData[y] = srcData[x];
328 } 328 }
329 } 329 }
330 break; 330 break;
331 default: 331 default:
332 dest = _original_data; 332 dest = _original_data;
333 break; 333 break;
334 } 334 }
335 335
336 } 336 }
337 _image_data = dest; 337 _image_data = dest;
338} 338}
339 339
340void OImageScrollView::generateImage() 340void OImageScrollView::generateImage()
341{ 341{
342 Rotation r = Rotate0; 342 Rotation r = Rotate0;
343 _pdata = QPixmap(); 343 _pdata = QPixmap();
344 if (_original_data.isNull()) { 344 if (_original_data.isNull()) {
345 emit imageSizeChanged( _image_data.size() ); 345 emit imageSizeChanged( _image_data.size() );
346 if (_zoomer) _zoomer->setImage( _image_data ); 346 if (_zoomer) _zoomer->setImage( _image_data );
347 return; 347 return;
348 } 348 }
349 if (width()>height()&&_original_data.width()<_original_data.height() || 349 if (width()>height()&&_original_data.width()<_original_data.height() ||
350 width()<height()&&_original_data.width()>_original_data.height()) { 350 width()<height()&&_original_data.width()>_original_data.height()) {
351 if (AutoRotate()) r = Rotate90; 351 if (AutoRotate()) r = Rotate90;
352 } 352 }
353 353
354 int twidth,theight; 354 int twidth,theight;
355 odebug << " r = " << r << oendl; 355 odebug << " r = " << r << oendl;
356 if (AutoScale() && (_original_data.width()>width() || _original_data.height() > height()) ) { 356 if (AutoScale() && (_original_data.width()>width() || _original_data.height() > height()) ) {
357 if (!_image_data.size().isValid()||width()>_image_data.width()||height()>_image_data.height()) { 357 if (!_image_data.size().isValid()||width()>_image_data.width()||height()>_image_data.height()) {
358 odebug << "Rescaling data" << oendl; 358 odebug << "Rescaling data" << oendl;
359 if (r==Rotate0) { 359 if (r==Rotate0) {
360 _image_data = _original_data; 360 _image_data = _original_data;
361 } else { 361 } else {
362 rotate_into_data(r); 362 rotate_into_data(r);
363 } 363 }
364 } 364 }
365 rescaleImage(width(),height()); 365 rescaleImage(width(),height());
366 } else if (!FirstResizeDone()||r!=m_last_rot||_image_data.width()==0) { 366 } else if (!FirstResizeDone()||r!=m_last_rot||_image_data.width()==0) {
367 if (r==Rotate0) { 367 if (r==Rotate0) {
368 _image_data = _original_data; 368 _image_data = _original_data;
369 } else { 369 } else {
370 rotate_into_data(r); 370 rotate_into_data(r);
371 } 371 }
372 m_last_rot = r; 372 m_last_rot = r;
373 } 373 }
374 _pdata.convertFromImage(_image_data); 374 _pdata.convertFromImage(_image_data);
375 twidth = _image_data.width(); 375 twidth = _image_data.width();
376 theight = _image_data.height(); 376 theight = _image_data.height();
377 377
378 /* 378 /*
379 * update the zoomer 379 * update the zoomer
380 */ 380 */
381 check_zoomer(); 381 check_zoomer();
382 emit imageSizeChanged( _image_data.size() ); 382 emit imageSizeChanged( _image_data.size() );
383 rescaleImage( 128, 128 ); 383 rescaleImage( 128, 128 );
384 resizeContents(twidth,theight); 384 resizeContents(twidth,theight);
385 /* 385 /*
386 * move scrollbar 386 * move scrollbar
387 */ 387 */
388 if (_zoomer) { 388 if (_zoomer) {
389 _zoomer->setGeometry( viewport()->width()-_image_data.width()/2, viewport()->height()-_image_data.height()/2, 389 _zoomer->setGeometry( viewport()->width()-_image_data.width()/2, viewport()->height()-_image_data.height()/2,
390 _image_data.width()/2, _image_data.height()/2 ); 390 _image_data.width()/2, _image_data.height()/2 );
391 _zoomer->setImage( _image_data ); 391 _zoomer->setImage( _image_data );
392 } 392 }
393 /* 393 /*
394 * invalidate 394 * invalidate
395 */ 395 */
396 _image_data=QImage(); 396 _image_data=QImage();
397 if (isVisible()) { 397 if (isVisible()) {
398 updateContents(contentsX(),contentsY(),width(),height()); 398 updateContents(contentsX(),contentsY(),width(),height());
399 } 399 }
400} 400}
401 401
402void OImageScrollView::resizeEvent(QResizeEvent * e) 402void OImageScrollView::resizeEvent(QResizeEvent * e)
403{ 403{
404 odebug << "OImageScrollView resizeEvent" << oendl; 404 odebug << "OImageScrollView resizeEvent (" << e->size() << " - " << e->oldSize() << oendl;
405 QScrollView::resizeEvent(e); 405 QScrollView::resizeEvent(e);
406 if (e->oldSize()==e->size()||!isUpdatesEnabled ()) return;
406 generateImage(); 407 generateImage();
407 setFirstResizeDone(true); 408 setFirstResizeDone(true);
408 emit viewportSizeChanged( viewport()->size() ); 409 emit viewportSizeChanged( viewport()->size() );
409 410
410} 411}
411 412
412void OImageScrollView::keyPressEvent(QKeyEvent * e) 413void OImageScrollView::keyPressEvent(QKeyEvent * e)
413{ 414{
414 if (!e) return; 415 if (!e) return;
415 int dx = horizontalScrollBar()->lineStep(); 416 int dx = horizontalScrollBar()->lineStep();
416 int dy = verticalScrollBar()->lineStep(); 417 int dy = verticalScrollBar()->lineStep();
417 if (e->key()==Qt::Key_Right) { 418 if (e->key()==Qt::Key_Right) {
418 scrollBy(dx,0); 419 scrollBy(dx,0);
419 e->accept(); 420 e->accept();
420 } else if (e->key()==Qt::Key_Left) { 421 } else if (e->key()==Qt::Key_Left) {
421 scrollBy(0-dx,0); 422 scrollBy(0-dx,0);
422 e->accept(); 423 e->accept();
423 } else if (e->key()==Qt::Key_Up) { 424 } else if (e->key()==Qt::Key_Up) {
424 scrollBy(0,0-dy); 425 scrollBy(0,0-dy);
425 e->accept(); 426 e->accept();
426 } else if (e->key()==Qt::Key_Down) { 427 } else if (e->key()==Qt::Key_Down) {
427 scrollBy(0,dy); 428 scrollBy(0,dy);
428 e->accept(); 429 e->accept();
429 } else { 430 } else {
430 e->ignore(); 431 e->ignore();
431 } 432 }
432 QScrollView::keyPressEvent(e); 433 QScrollView::keyPressEvent(e);
433} 434}
434 435
435void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) 436void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph)
436{ 437{
437 if (!_pdata.size().isValid()) { 438 if (!_pdata.size().isValid()) {
438 p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); 439 p->fillRect(clipx,clipy,clipw,cliph, backgroundColor());
439 return; 440 return;
440 } 441 }
441 442
442 int w = clipw; 443 int w = clipw;
443 int h = cliph; 444 int h = cliph;
444 int x = clipx; 445 int x = clipx;
445 int y = clipy; 446 int y = clipy;
446 bool erase = false; 447 bool erase = false;
447 448
448 if (w>_pdata.width()) { 449 if (w>_pdata.width()) {
449 w = _pdata.width()-x; 450 w = _pdata.width()-x;
450 erase=true; 451 erase=true;
451 } 452 }
452 if (h>_pdata.height()) { 453 if (h>_pdata.height()) {
453 h = _pdata.height()-y; 454 h = _pdata.height()-y;
454 erase=true; 455 erase=true;
455 } 456 }
456 if (!erase && (clipy+cliph>_pdata.height()||clipx+clipw>_pdata.width())) { 457 if (!erase && (clipy+cliph>_pdata.height()||clipx+clipw>_pdata.width())) {
457 erase = true; 458 erase = true;
458 } 459 }
459 if (erase||_original_data.hasAlphaBuffer()) { 460 if (erase||_original_data.hasAlphaBuffer()) {
460 p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); 461 p->fillRect(clipx,clipy,clipw,cliph, backgroundColor());
461 } 462 }
462 if (w>0 && h>0&&x<_pdata.width()&&y<_pdata.height()) { 463 if (w>0 && h>0&&x<_pdata.width()&&y<_pdata.height()) {
463 odebug << "Drawing pixmap" << oendl; 464 odebug << "Drawing pixmap" << oendl;
464 p->drawPixmap(clipx,clipy,_pdata,x,y,w,h); 465 p->drawPixmap(clipx,clipy,_pdata,x,y,w,h);
465 } 466 }
466} 467}
467 468
468/* using the real geometry points and not the translated points is wanted! */ 469/* using the real geometry points and not the translated points is wanted! */
469void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) 470void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e)
470{ 471{
471 int mx, my; 472 int mx, my;
472 mx = e->x(); 473 mx = e->x();
473 my = e->y(); 474 my = e->y();
474 if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { 475 if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) {
475 int diffx = _mouseStartPosX-mx; 476 int diffx = _mouseStartPosX-mx;
476 int diffy = _mouseStartPosY-my; 477 int diffy = _mouseStartPosY-my;
477 scrollBy(diffx,diffy); 478 scrollBy(diffx,diffy);
478 } 479 }
479 _mouseStartPosX=mx; 480 _mouseStartPosX=mx;
480 _mouseStartPosY=my; 481 _mouseStartPosY=my;
481} 482}
482 483
483void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e) 484void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e)
484{ 485{
485 odebug << " X and Y " << e->x() << " " << e->y() << oendl; 486 odebug << " X and Y " << e->x() << " " << e->y() << oendl;
486 /* this marks the beginning of a possible mouse move. Due internal reasons of QT 487 /* this marks the beginning of a possible mouse move. Due internal reasons of QT
487 the geometry values here may real differ from that set in MoveEvent (I don't know 488 the geometry values here may real differ from that set in MoveEvent (I don't know
488 why). For getting them in real context, we use the first move-event to set the start 489 why). For getting them in real context, we use the first move-event to set the start
489 position ;) 490 position ;)
490 */ 491 */
491 _mouseStartPosX = -1; 492 _mouseStartPosX = -1;
492 _mouseStartPosY = -1; 493 _mouseStartPosY = -1;
493} 494}
494 495
495void OImageScrollView::setDestructiveClose() { 496void OImageScrollView::setDestructiveClose() {
496 WFlags fl = getWFlags(); 497 WFlags fl = getWFlags();
497 /* clear it just in case */ 498 /* clear it just in case */
498 fl &= ~WDestructiveClose; 499 fl &= ~WDestructiveClose;
499 fl |= WDestructiveClose; 500 fl |= WDestructiveClose;
500 setWFlags( fl ); 501 setWFlags( fl );
501} 502}
502 503
503bool OImageScrollView::image_fit_into(const QSize&s ) 504bool OImageScrollView::image_fit_into(const QSize&s )
504{ 505{
505 if (s.width()>width()||s.height()>height()) { 506 if (s.width()>width()||s.height()>height()) {
506 return false; 507 return false;
507 } 508 }
508 return true; 509 return true;
509} 510}
510 511
511void OImageScrollView::setShowZoomer(bool how) 512void OImageScrollView::setShowZoomer(bool how)
512{ 513{
513 m_states.setBit(SHOW_ZOOMER,how); 514 m_states.setBit(SHOW_ZOOMER,how);
514 check_zoomer(); 515 check_zoomer();
515} 516}
516 517
517bool OImageScrollView::ShowZoomer()const 518bool OImageScrollView::ShowZoomer()const
518{ 519{
519 return m_states.testBit(SHOW_ZOOMER); 520 return m_states.testBit(SHOW_ZOOMER);
520} 521}
521 522
522void OImageScrollView::check_zoomer() 523void OImageScrollView::check_zoomer()
523{ 524{
524 if (!_zoomer) return; 525 if (!_zoomer) return;
525 if ( (!ShowZoomer()||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) { 526 if ( (!ShowZoomer()||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) {
526 _zoomer->hide(); 527 _zoomer->hide();
527 } else if ( ShowZoomer() && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){ 528 } else if ( ShowZoomer() && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){
528 _zoomer->show(); 529 _zoomer->show();
529 } 530 }
530} 531}
531 532
532bool OImageScrollView::FirstResizeDone()const 533bool OImageScrollView::FirstResizeDone()const
533{ 534{
534 return m_states.testBit(FIRST_RESIZE_DONE); 535 return m_states.testBit(FIRST_RESIZE_DONE);
535} 536}
536 537
537void OImageScrollView::setFirstResizeDone(bool how) 538void OImageScrollView::setFirstResizeDone(bool how)
538{ 539{
539 m_states.setBit(FIRST_RESIZE_DONE,how); 540 m_states.setBit(FIRST_RESIZE_DONE,how);
540} 541}
541 542
542bool OImageScrollView::ImageIsJpeg()const 543bool OImageScrollView::ImageIsJpeg()const
543{ 544{
544 return m_states.testBit(IMAGE_IS_JPEG); 545 return m_states.testBit(IMAGE_IS_JPEG);
545} 546}
546 547
547void OImageScrollView::setImageIsJpeg(bool how) 548void OImageScrollView::setImageIsJpeg(bool how)
548{ 549{
549 m_states.setBit(IMAGE_IS_JPEG,how); 550 m_states.setBit(IMAGE_IS_JPEG,how);
550} 551}
551 552
552bool OImageScrollView::ImageScaledLoaded()const 553bool OImageScrollView::ImageScaledLoaded()const
553{ 554{
554 return m_states.testBit(IMAGE_SCALED_LOADED); 555 return m_states.testBit(IMAGE_SCALED_LOADED);
555} 556}
556 557
557void OImageScrollView::setImageScaledLoaded(bool how) 558void OImageScrollView::setImageScaledLoaded(bool how)
558{ 559{
559 m_states.setBit(IMAGE_SCALED_LOADED,how); 560 m_states.setBit(IMAGE_SCALED_LOADED,how);
560} 561}
561 562
562} // namespace MM 563} // namespace MM
563} // namespace Opie 564} // namespace Opie