Magellan Linux

Annotation of /trunk/qt/patches/qt-3.3.4-flickerfree_qiconview_buffered.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 153 - (hide annotations) (download)
Tue May 8 20:52:56 2007 UTC (17 years, 1 month ago) by niro
File size: 3347 byte(s)
-import

1 niro 153 Buffered QIconView.
2    
3     For every QIconView this patch creates a backbuffer where the image will
4     grow up (aka will be painted) before blitting the results to the screen.
5     This solves the konqueror flickering problems at its roots. There are
6     some more bugs that make conqueror repaint without reason.. patches
7     will follow.
8     Enrico Ros <eros.kde@email.it>
9    
10     --- src.orig/iconview/qiconview.cpp 2004-03-24 15:58:05.000000000 +0000
11     +++ src/iconview/qiconview.cpp 2004-03-30 16:23:32.521253280 +0000
12     @@ -211,6 +211,7 @@
13     QIconViewItem *currentItem, *tmpCurrentItem, *highlightedItem,
14     *startDragItem, *pressedItem, *selectAnchor, *renamingItem;
15     QRect *rubber;
16     + QPixmap *backBuffer;
17     QTimer *scrollTimer, *adjustTimer, *updateTimer, *inputTimer,
18     *fullRedrawTimer;
19     int rastX, rastY, spacing;
20     @@ -2731,6 +2732,7 @@
21     d->currentItem = 0;
22     d->highlightedItem = 0;
23     d->rubber = 0;
24     + d->backBuffer = 0;
25     d->scrollTimer = 0;
26     d->startDragItem = 0;
27     d->tmpCurrentItem = 0;
28     @@ -2883,6 +2885,8 @@
29     delete item;
30     item = tmp;
31     }
32     + delete d->backBuffer;
33     + d->backBuffer = 0;
34     delete d->fm;
35     d->fm = 0;
36     #ifndef QT_NO_TOOLTIP
37     @@ -4845,6 +4849,47 @@
38     #endif
39    
40     /*!
41     + This function grabs all paintevents that otherwise would have been
42     + processed by the QScrollView::viewportPaintEvent(). Here we use a
43     + doublebuffer to reduce 'on-paint' flickering on QIconView
44     + (and of course its childs).
45     +
46     + \sa QScrollView::viewportPaintEvent(), QIconView::drawContents()
47     +*/
48     +
49     +void QIconView::bufferedPaintEvent( QPaintEvent* pe )
50     +{
51     + QWidget* vp = viewport();
52     + QRect r = pe->rect() & vp->rect();
53     + int ex = r.x() + contentsX();
54     + int ey = r.y() + contentsY();
55     + int ew = r.width();
56     + int eh = r.height();
57     +
58     + if ( !d->backBuffer )
59     + d->backBuffer = new QPixmap(vp->size());
60     + if ( d->backBuffer->size() != vp->size() ) {
61     + //Resize function (with hysteesis). Uses a good compromise between memory
62     + //consumption and speed (number) of resizes.
63     + float newWidth = (float)vp->width();
64     + float newHeight = (float)vp->height();
65     + if ( newWidth > d->backBuffer->width() || newHeight > d->backBuffer->height() )
66     + {
67     + newWidth *= 1.1892;
68     + newHeight *= 1.1892;
69     + d->backBuffer->resize( (int)newWidth, (int)newHeight );
70     + } else if ( 1.5*newWidth < d->backBuffer->width() || 1.5*newHeight < d->backBuffer->height() )
71     + d->backBuffer->resize( (int)newWidth, (int)newHeight );
72     + }
73     +
74     + QPainter p;
75     + p.begin(d->backBuffer, vp);
76     + drawContentsOffset(&p, contentsX(), contentsY(), ex, ey, ew, eh);
77     + p.end();
78     + bitBlt(vp, r.x(), r.y(), d->backBuffer, r.x(), r.y(), ew, eh);
79     +}
80     +
81     +/*!
82     \reimp
83     */
84    
85     @@ -5627,7 +5676,7 @@
86     if ( !d->rubber )
87     drawDragShapes( d->oldDragPos );
88     }
89     - viewportPaintEvent( (QPaintEvent*)e );
90     + bufferedPaintEvent( (QPaintEvent*)e );
91     if ( d->dragging ) {
92     if ( !d->rubber )
93     drawDragShapes( d->oldDragPos );
94     --- src.orig/iconview/qiconview.h 2004-03-30 16:00:47.605751976 +0000
95     +++ src/iconview/qiconview.h 2003-05-16 13:02:38.000000000 +0000
96     @@ -445,6 +445,7 @@
97     void contentsDropEvent( QDropEvent *e );
98     #endif
99    
100     + void bufferedPaintEvent( QPaintEvent* );
101     void resizeEvent( QResizeEvent* e );
102     void keyPressEvent( QKeyEvent *e );
103     void focusInEvent( QFocusEvent *e );