-rw-r--r-- | libopie2/opiemm/oimagescrollview.cpp | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/libopie2/opiemm/oimagescrollview.cpp b/libopie2/opiemm/oimagescrollview.cpp index 72248c1..56be10b 100644 --- a/libopie2/opiemm/oimagescrollview.cpp +++ b/libopie2/opiemm/oimagescrollview.cpp | |||
@@ -80,485 +80,484 @@ void OImageScrollView::setImage(const QImage&img) | |||
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 ); |
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 | ||
116 | void OImageScrollView::setImage( const QString& path ) { | 116 | void 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 */ |
140 | void OImageScrollView::init() | 140 | void 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 | ||
173 | void OImageScrollView::setAutoRotate(bool how) | 173 | void 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 | ||
183 | bool OImageScrollView::AutoRotate()const | 183 | bool OImageScrollView::AutoRotate()const |
184 | { | 184 | { |
185 | return m_states.testBit(AUTO_ROTATE); | 185 | return m_states.testBit(AUTO_ROTATE); |
186 | } | 186 | } |
187 | 187 | ||
188 | void OImageScrollView::setAutoScaleRotate(bool scale, bool rotate) | 188 | void 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 | ||
194 | void OImageScrollView::setAutoScale(bool how) | 194 | void 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 | ||
204 | bool OImageScrollView::AutoScale()const | 204 | bool OImageScrollView::AutoScale()const |
205 | { | 205 | { |
206 | return m_states.testBit(AUTO_SCALE); | 206 | return m_states.testBit(AUTO_SCALE); |
207 | } | 207 | } |
208 | 208 | ||
209 | OImageScrollView::~OImageScrollView() | 209 | OImageScrollView::~OImageScrollView() |
210 | { | 210 | { |
211 | } | 211 | } |
212 | 212 | ||
213 | void OImageScrollView::rescaleImage(int w, int h) | 213 | void 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 | ||
226 | void OImageScrollView::rotate_into_data(Rotation r) | 226 | void 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 | ||
340 | void OImageScrollView::generateImage() | 340 | void 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 | ||
402 | void OImageScrollView::resizeEvent(QResizeEvent * e) | 402 | void OImageScrollView::resizeEvent(QResizeEvent * e) |
403 | { | 403 | { |
404 | odebug << "OImageScrollView resizeEvent (" << e->size() << " - " << e->oldSize() << 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 | if (e->oldSize()==e->size()||!isUpdatesEnabled ()) return; |
407 | generateImage(); | 407 | generateImage(); |
408 | setFirstResizeDone(true); | 408 | setFirstResizeDone(true); |
409 | emit viewportSizeChanged( viewport()->size() ); | 409 | emit viewportSizeChanged( viewport()->size() ); |
410 | 410 | ||
411 | } | 411 | } |
412 | 412 | ||
413 | void OImageScrollView::keyPressEvent(QKeyEvent * e) | 413 | void OImageScrollView::keyPressEvent(QKeyEvent * e) |
414 | { | 414 | { |
415 | if (!e) return; | 415 | if (!e) return; |
416 | int dx = horizontalScrollBar()->lineStep(); | 416 | int dx = horizontalScrollBar()->lineStep(); |
417 | int dy = verticalScrollBar()->lineStep(); | 417 | int dy = verticalScrollBar()->lineStep(); |
418 | if (e->key()==Qt::Key_Right) { | 418 | if (e->key()==Qt::Key_Right) { |
419 | scrollBy(dx,0); | 419 | scrollBy(dx,0); |
420 | e->accept(); | 420 | e->accept(); |
421 | } else if (e->key()==Qt::Key_Left) { | 421 | } else if (e->key()==Qt::Key_Left) { |
422 | scrollBy(0-dx,0); | 422 | scrollBy(0-dx,0); |
423 | e->accept(); | 423 | e->accept(); |
424 | } else if (e->key()==Qt::Key_Up) { | 424 | } else if (e->key()==Qt::Key_Up) { |
425 | scrollBy(0,0-dy); | 425 | scrollBy(0,0-dy); |
426 | e->accept(); | 426 | e->accept(); |
427 | } else if (e->key()==Qt::Key_Down) { | 427 | } else if (e->key()==Qt::Key_Down) { |
428 | scrollBy(0,dy); | 428 | scrollBy(0,dy); |
429 | e->accept(); | 429 | e->accept(); |
430 | } else { | 430 | } else { |
431 | e->ignore(); | 431 | e->ignore(); |
432 | } | 432 | } |
433 | QScrollView::keyPressEvent(e); | 433 | QScrollView::keyPressEvent(e); |
434 | } | 434 | } |
435 | 435 | ||
436 | void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) | 436 | void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) |
437 | { | 437 | { |
438 | if (!_pdata.size().isValid()) { | 438 | if (!_pdata.size().isValid()) { |
439 | p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); | 439 | p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); |
440 | return; | 440 | return; |
441 | } | 441 | } |
442 | 442 | ||
443 | int w = clipw; | 443 | int w = clipw; |
444 | int h = cliph; | 444 | int h = cliph; |
445 | int x = clipx; | 445 | int x = clipx; |
446 | int y = clipy; | 446 | int y = clipy; |
447 | bool erase = false; | 447 | bool erase = false; |
448 | 448 | ||
449 | if (w>_pdata.width()) { | 449 | if (w>_pdata.width()) { |
450 | w = _pdata.width()-x; | 450 | w = _pdata.width()-x; |
451 | erase=true; | 451 | erase=true; |
452 | } | 452 | } |
453 | if (h>_pdata.height()) { | 453 | if (h>_pdata.height()) { |
454 | h = _pdata.height()-y; | 454 | h = _pdata.height()-y; |
455 | erase=true; | 455 | erase=true; |
456 | } | 456 | } |
457 | if (!erase && (clipy+cliph>_pdata.height()||clipx+clipw>_pdata.width())) { | 457 | if (!erase && (clipy+cliph>_pdata.height()||clipx+clipw>_pdata.width())) { |
458 | erase = true; | 458 | erase = true; |
459 | } | 459 | } |
460 | if (erase||_original_data.hasAlphaBuffer()) { | 460 | if (erase||_original_data.hasAlphaBuffer()) { |
461 | p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); | 461 | p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); |
462 | } | 462 | } |
463 | if (w>0 && h>0&&x<_pdata.width()&&y<_pdata.height()) { | 463 | if (w>0 && h>0&&x<_pdata.width()&&y<_pdata.height()) { |
464 | odebug << "Drawing pixmap" << oendl; | ||
465 | p->drawPixmap(clipx,clipy,_pdata,x,y,w,h); | 464 | p->drawPixmap(clipx,clipy,_pdata,x,y,w,h); |
466 | } | 465 | } |
467 | } | 466 | } |
468 | 467 | ||
469 | /* 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! */ |
470 | void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) | 469 | void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) |
471 | { | 470 | { |
472 | int mx, my; | 471 | int mx, my; |
473 | mx = e->x(); | 472 | mx = e->x(); |
474 | my = e->y(); | 473 | my = e->y(); |
475 | if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { | 474 | if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { |
476 | int diffx = _mouseStartPosX-mx; | 475 | int diffx = _mouseStartPosX-mx; |
477 | int diffy = _mouseStartPosY-my; | 476 | int diffy = _mouseStartPosY-my; |
478 | scrollBy(diffx,diffy); | 477 | scrollBy(diffx,diffy); |
479 | } | 478 | } |
480 | _mouseStartPosX=mx; | 479 | _mouseStartPosX=mx; |
481 | _mouseStartPosY=my; | 480 | _mouseStartPosY=my; |
482 | } | 481 | } |
483 | 482 | ||
484 | void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e) | 483 | void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e) |
485 | { | 484 | { |
486 | odebug << " X and Y " << e->x() << " " << e->y() << oendl; | 485 | odebug << " X and Y " << e->x() << " " << e->y() << oendl; |
487 | /* 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 |
488 | 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 |
489 | 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 |
490 | position ;) | 489 | position ;) |
491 | */ | 490 | */ |
492 | _mouseStartPosX = -1; | 491 | _mouseStartPosX = -1; |
493 | _mouseStartPosY = -1; | 492 | _mouseStartPosY = -1; |
494 | } | 493 | } |
495 | 494 | ||
496 | void OImageScrollView::setDestructiveClose() { | 495 | void OImageScrollView::setDestructiveClose() { |
497 | WFlags fl = getWFlags(); | 496 | WFlags fl = getWFlags(); |
498 | /* clear it just in case */ | 497 | /* clear it just in case */ |
499 | fl &= ~WDestructiveClose; | 498 | fl &= ~WDestructiveClose; |
500 | fl |= WDestructiveClose; | 499 | fl |= WDestructiveClose; |
501 | setWFlags( fl ); | 500 | setWFlags( fl ); |
502 | } | 501 | } |
503 | 502 | ||
504 | bool OImageScrollView::image_fit_into(const QSize&s ) | 503 | bool OImageScrollView::image_fit_into(const QSize&s ) |
505 | { | 504 | { |
506 | if (s.width()>width()||s.height()>height()) { | 505 | if (s.width()>width()||s.height()>height()) { |
507 | return false; | 506 | return false; |
508 | } | 507 | } |
509 | return true; | 508 | return true; |
510 | } | 509 | } |
511 | 510 | ||
512 | void OImageScrollView::setShowZoomer(bool how) | 511 | void OImageScrollView::setShowZoomer(bool how) |
513 | { | 512 | { |
514 | m_states.setBit(SHOW_ZOOMER,how); | 513 | m_states.setBit(SHOW_ZOOMER,how); |
515 | check_zoomer(); | 514 | check_zoomer(); |
516 | } | 515 | } |
517 | 516 | ||
518 | bool OImageScrollView::ShowZoomer()const | 517 | bool OImageScrollView::ShowZoomer()const |
519 | { | 518 | { |
520 | return m_states.testBit(SHOW_ZOOMER); | 519 | return m_states.testBit(SHOW_ZOOMER); |
521 | } | 520 | } |
522 | 521 | ||
523 | void OImageScrollView::check_zoomer() | 522 | void OImageScrollView::check_zoomer() |
524 | { | 523 | { |
525 | if (!_zoomer) return; | 524 | if (!_zoomer) return; |
526 | if ( (!ShowZoomer()||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) { | 525 | if ( (!ShowZoomer()||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) { |
527 | _zoomer->hide(); | 526 | _zoomer->hide(); |
528 | } else if ( ShowZoomer() && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){ | 527 | } else if ( ShowZoomer() && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){ |
529 | _zoomer->show(); | 528 | _zoomer->show(); |
530 | } | 529 | } |
531 | } | 530 | } |
532 | 531 | ||
533 | bool OImageScrollView::FirstResizeDone()const | 532 | bool OImageScrollView::FirstResizeDone()const |
534 | { | 533 | { |
535 | return m_states.testBit(FIRST_RESIZE_DONE); | 534 | return m_states.testBit(FIRST_RESIZE_DONE); |
536 | } | 535 | } |
537 | 536 | ||
538 | void OImageScrollView::setFirstResizeDone(bool how) | 537 | void OImageScrollView::setFirstResizeDone(bool how) |
539 | { | 538 | { |
540 | m_states.setBit(FIRST_RESIZE_DONE,how); | 539 | m_states.setBit(FIRST_RESIZE_DONE,how); |
541 | } | 540 | } |
542 | 541 | ||
543 | bool OImageScrollView::ImageIsJpeg()const | 542 | bool OImageScrollView::ImageIsJpeg()const |
544 | { | 543 | { |
545 | return m_states.testBit(IMAGE_IS_JPEG); | 544 | return m_states.testBit(IMAGE_IS_JPEG); |
546 | } | 545 | } |
547 | 546 | ||
548 | void OImageScrollView::setImageIsJpeg(bool how) | 547 | void OImageScrollView::setImageIsJpeg(bool how) |
549 | { | 548 | { |
550 | m_states.setBit(IMAGE_IS_JPEG,how); | 549 | m_states.setBit(IMAGE_IS_JPEG,how); |
551 | } | 550 | } |
552 | 551 | ||
553 | bool OImageScrollView::ImageScaledLoaded()const | 552 | bool OImageScrollView::ImageScaledLoaded()const |
554 | { | 553 | { |
555 | return m_states.testBit(IMAGE_SCALED_LOADED); | 554 | return m_states.testBit(IMAGE_SCALED_LOADED); |
556 | } | 555 | } |
557 | 556 | ||
558 | void OImageScrollView::setImageScaledLoaded(bool how) | 557 | void OImageScrollView::setImageScaledLoaded(bool how) |
559 | { | 558 | { |
560 | m_states.setBit(IMAGE_SCALED_LOADED,how); | 559 | m_states.setBit(IMAGE_SCALED_LOADED,how); |
561 | } | 560 | } |
562 | 561 | ||
563 | } // namespace MM | 562 | } // namespace MM |
564 | } // namespace Opie | 563 | } // namespace Opie |