summaryrefslogtreecommitdiff
authoralwin <alwin>2004-04-21 10:47:31 (UTC)
committer alwin <alwin>2004-04-21 10:47:31 (UTC)
commit6902a2e25e93f2c2d472b89a35e19668dffd4866 (patch) (unidiff)
tree7512cf17ca49b420dd4e6c9758fcc846b5e8cd1a
parentf4ab243362a9b93f17e92bbf3189324f66c8f686 (diff)
downloadopie-6902a2e25e93f2c2d472b89a35e19668dffd4866.zip
opie-6902a2e25e93f2c2d472b89a35e19668dffd4866.tar.gz
opie-6902a2e25e93f2c2d472b89a35e19668dffd4866.tar.bz2
improved painting, eg., when clip area is outside image we must not
paint the image of course....
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiemm/oimagescrollview.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/libopie2/opiemm/oimagescrollview.cpp b/libopie2/opiemm/oimagescrollview.cpp
index a8165a4..73df3ff 100644
--- a/libopie2/opiemm/oimagescrollview.cpp
+++ b/libopie2/opiemm/oimagescrollview.cpp
@@ -255,308 +255,323 @@ void OImageScrollView::rotate_into_data(Rotation r)
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" << oendl;
405 QScrollView::resizeEvent(e); 405 QScrollView::resizeEvent(e);
406 generateImage(); 406 generateImage();
407 setFirstResizeDone(true); 407 setFirstResizeDone(true);
408 emit viewportSizeChanged( viewport()->size() ); 408 emit viewportSizeChanged( viewport()->size() );
409 409
410} 410}
411 411
412void OImageScrollView::keyPressEvent(QKeyEvent * e) 412void 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 int w = clipw; 437 int w = clipw;
438 int h = cliph; 438 int h = cliph;
439 int x = clipx; 439 int x = clipx;
440 int y = clipy; 440 int y = clipy;
441 bool erase = false; 441 bool erase = false;
442 442
443 if (!_pdata.size().isValid()) { 443 if (!_pdata.size().isValid()) {
444 p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); 444 p->fillRect(clipx,clipy,clipw,cliph, backgroundColor());
445 return; 445 return;
446 } 446 }
447
447 if (w>_pdata.width()) { 448 if (w>_pdata.width()) {
448 w=_pdata.width(); 449 w=_pdata.width();
449 x = 0; 450 x = 0;
450 erase = true; 451 erase = true;
451 } else if (x+w>_pdata.width()){ 452 } else if (x+w>_pdata.width()){
452 x = _pdata.width()-w; 453 x = _pdata.width()-w;
453 } 454 }
455
454 if (h>_pdata.height()) { 456 if (h>_pdata.height()) {
455 h=_pdata.height(); 457 h=_pdata.height();
456 y = 0; 458 y = 0;
457 erase = true; 459 erase = true;
458 } else if (y+h>_pdata.height()){ 460 } else if (y+h>_pdata.height()){
459 y = _pdata.height()-h; 461 y = _pdata.height()-h;
460 } 462 }
461 if (erase||_original_data.hasAlphaBuffer()) { 463
464 if (erase||_original_data.hasAlphaBuffer()||clipy>_pdata.height()||clipx>_pdata.width()) {
465 odebug << QSize(clipx,clipy) << " # " << QSize(clipw,cliph) << oendl;
462 p->fillRect(clipx,clipy,clipw,cliph, backgroundColor()); 466 p->fillRect(clipx,clipy,clipw,cliph, backgroundColor());
463 } 467 }
464 p->drawPixmap(clipx,clipy,_pdata,x,y,w,h); 468 odebug << QSize(x,y) << " - " << QSize(w,h) << oendl;
469 if (clipy<=_pdata.height()&&clipx<=_pdata.width()) {
470#if 0
471 odebug << "painting image content" << oendl;
472#endif
473 p->drawPixmap(clipx,clipy,_pdata,x,y,w,h);
474 }
475#if 0
476else {
477 odebug << "not painting image content" << oendl;
478 }
479#endif
465} 480}
466 481
467/* using the real geometry points and not the translated points is wanted! */ 482/* using the real geometry points and not the translated points is wanted! */
468void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) 483void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e)
469{ 484{
470 int mx, my; 485 int mx, my;
471 mx = e->x(); 486 mx = e->x();
472 my = e->y(); 487 my = e->y();
473 if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { 488 if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) {
474 int diffx = _mouseStartPosX-mx; 489 int diffx = _mouseStartPosX-mx;
475 int diffy = _mouseStartPosY-my; 490 int diffy = _mouseStartPosY-my;
476 scrollBy(diffx,diffy); 491 scrollBy(diffx,diffy);
477 } 492 }
478 _mouseStartPosX=mx; 493 _mouseStartPosX=mx;
479 _mouseStartPosY=my; 494 _mouseStartPosY=my;
480} 495}
481 496
482void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e) 497void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e)
483{ 498{
484 odebug << " X and Y " << e->x() << " " << e->y() << oendl; 499 odebug << " X and Y " << e->x() << " " << e->y() << oendl;
485 /* this marks the beginning of a possible mouse move. Due internal reasons of QT 500 /* this marks the beginning of a possible mouse move. Due internal reasons of QT
486 the geometry values here may real differ from that set in MoveEvent (I don't know 501 the geometry values here may real differ from that set in MoveEvent (I don't know
487 why). For getting them in real context, we use the first move-event to set the start 502 why). For getting them in real context, we use the first move-event to set the start
488 position ;) 503 position ;)
489 */ 504 */
490 _mouseStartPosX = -1; 505 _mouseStartPosX = -1;
491 _mouseStartPosY = -1; 506 _mouseStartPosY = -1;
492} 507}
493 508
494void OImageScrollView::setDestructiveClose() { 509void OImageScrollView::setDestructiveClose() {
495 WFlags fl = getWFlags(); 510 WFlags fl = getWFlags();
496 /* clear it just in case */ 511 /* clear it just in case */
497 fl &= ~WDestructiveClose; 512 fl &= ~WDestructiveClose;
498 fl |= WDestructiveClose; 513 fl |= WDestructiveClose;
499 setWFlags( fl ); 514 setWFlags( fl );
500} 515}
501 516
502bool OImageScrollView::image_fit_into(const QSize&s ) 517bool OImageScrollView::image_fit_into(const QSize&s )
503{ 518{
504 if (s.width()>width()||s.height()>height()) { 519 if (s.width()>width()||s.height()>height()) {
505 return false; 520 return false;
506 } 521 }
507 return true; 522 return true;
508} 523}
509 524
510void OImageScrollView::setShowZoomer(bool how) 525void OImageScrollView::setShowZoomer(bool how)
511{ 526{
512 m_states.setBit(SHOW_ZOOMER,how); 527 m_states.setBit(SHOW_ZOOMER,how);
513 check_zoomer(); 528 check_zoomer();
514} 529}
515 530
516bool OImageScrollView::ShowZoomer()const 531bool OImageScrollView::ShowZoomer()const
517{ 532{
518 return m_states.testBit(SHOW_ZOOMER); 533 return m_states.testBit(SHOW_ZOOMER);
519} 534}
520 535
521void OImageScrollView::check_zoomer() 536void OImageScrollView::check_zoomer()
522{ 537{
523 if (!_zoomer) return; 538 if (!_zoomer) return;
524 if ( (!ShowZoomer()||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) { 539 if ( (!ShowZoomer()||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) {
525 _zoomer->hide(); 540 _zoomer->hide();
526 } else if ( ShowZoomer() && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){ 541 } else if ( ShowZoomer() && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){
527 _zoomer->show(); 542 _zoomer->show();
528 } 543 }
529} 544}
530 545
531bool OImageScrollView::FirstResizeDone()const 546bool OImageScrollView::FirstResizeDone()const
532{ 547{
533 return m_states.testBit(FIRST_RESIZE_DONE); 548 return m_states.testBit(FIRST_RESIZE_DONE);
534} 549}
535 550
536void OImageScrollView::setFirstResizeDone(bool how) 551void OImageScrollView::setFirstResizeDone(bool how)
537{ 552{
538 m_states.setBit(FIRST_RESIZE_DONE,how); 553 m_states.setBit(FIRST_RESIZE_DONE,how);
539} 554}
540 555
541bool OImageScrollView::ImageIsJpeg()const 556bool OImageScrollView::ImageIsJpeg()const
542{ 557{
543 return m_states.testBit(IMAGE_IS_JPEG); 558 return m_states.testBit(IMAGE_IS_JPEG);
544} 559}
545 560
546void OImageScrollView::setImageIsJpeg(bool how) 561void OImageScrollView::setImageIsJpeg(bool how)
547{ 562{
548 m_states.setBit(IMAGE_IS_JPEG,how); 563 m_states.setBit(IMAGE_IS_JPEG,how);
549} 564}
550 565
551bool OImageScrollView::ImageScaledLoaded()const 566bool OImageScrollView::ImageScaledLoaded()const
552{ 567{
553 return m_states.testBit(IMAGE_SCALED_LOADED); 568 return m_states.testBit(IMAGE_SCALED_LOADED);
554} 569}
555 570
556void OImageScrollView::setImageScaledLoaded(bool how) 571void OImageScrollView::setImageScaledLoaded(bool how)
557{ 572{
558 m_states.setBit(IMAGE_SCALED_LOADED,how); 573 m_states.setBit(IMAGE_SCALED_LOADED,how);
559} 574}
560 575
561} // namespace MM 576} // namespace MM
562} // namespace Opie 577} // namespace Opie