summaryrefslogtreecommitdiff
path: root/qte/qte-2.3.7/qiconview-speed.patch
blob: cf4422942ce44f51e477621d555c60c5a8bac663 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
diff -u qt-2.3.7_old/src/iconview/qiconview.cpp qt-2.3.7/src/iconview/qiconview.cpp
--- qt-2.3.7_old/src/iconview/qiconview.cpp	2004-06-13 22:29:56.000000000 +0200
+++ qt-2.3.7/src/iconview/qiconview.cpp	2004-06-13 22:33:32.000000000 +0200
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** $Id$
 **
 ** Implementation of QIconView widget class
 **
@@ -220,6 +220,7 @@
     QIconView::SelectionMode selectionMode;
     QIconViewItem *currentItem, *tmpCurrentItem, *highlightedItem, *startDragItem, *pressedItem, *selectAnchor;
     QRect *rubber;
+    QPixmap *backBuffer;
     QTimer *scrollTimer, *adjustTimer, *updateTimer, *inputTimer,
 	*fullRedrawTimer;
     int rastX, rastY, spacing;
@@ -2263,6 +2264,7 @@
     d->currentItem = 0;
     d->highlightedItem = 0;
     d->rubber = 0;
+    d->backBuffer = 0;
     d->scrollTimer = 0;
     d->startDragItem = 0;
     d->tmpCurrentItem = 0;
@@ -2411,6 +2413,8 @@
 	delete item;
 	item = tmp;
     }
+    delete d->backBuffer;
+    d->backBuffer = 0;
     delete d->fm;
     d->fm = 0;
 #ifndef QT_NO_TOOLTIP
@@ -2877,6 +2881,48 @@
 }
 
 /*!
+    This function grabs all paintevents that otherwise would have been
+    processed by the QScrollView::viewportPaintEvent(). Here we use a
+    doublebuffer to reduce 'on-paint' flickering on QIconView
+    (and of course its childs).
+
+    \sa QScrollView::viewportPaintEvent(), QIconView::drawContents()
+*/
+
+void QIconView::bufferedPaintEvent( QPaintEvent* pe )
+{
+    QWidget* vp = viewport();
+    QRect r = pe->rect() & vp->rect();
+    int ex = r.x() + contentsX();
+    int ey = r.y() + contentsY();
+    int ew = r.width();
+    int eh = r.height();
+
+    if ( !d->backBuffer )
+	d->backBuffer = new QPixmap(vp->size());
+    if ( d->backBuffer->size() != vp->size() ) {
+	//Resize function (with hysteesis). Uses a good compromise between memory
+	//consumption and speed (number) of resizes.
+        float newWidth = (float)vp->width();
+	float newHeight = (float)vp->height();
+	if ( newWidth > d->backBuffer->width() || newHeight > d->backBuffer->height() )
+	{
+	    newWidth *= 1.1892;
+	    newHeight *= 1.1892;
+	    d->backBuffer->resize( (int)newWidth, (int)newHeight );
+	} else if ( 1.5*newWidth < d->backBuffer->width() || 1.5*newHeight < d->backBuffer->height() )
+	    d->backBuffer->resize( (int)newWidth, (int)newHeight );
+    }
+
+    QPainter p;
+    p.begin(d->backBuffer, vp);
+    drawContentsOffset(&p, contentsX(), contentsY(), ex, ey, ew, eh);
+    p.end();
+    bitBlt(vp, r.x(), r.y(), d->backBuffer, r.x(), r.y(), ew, eh);
+}
+
+/*!
+
   \reimp
 */
 
@@ -4855,7 +4901,7 @@
 		if ( !d->rubber )
 		    drawDragShapes( d->oldDragPos );
 	    }
-	    viewportPaintEvent( (QPaintEvent*)e );
+            bufferedPaintEvent ((QPaintEvent*)e );
 	    if ( d->dragging ) {
 		if ( !d->rubber )
 		    drawDragShapes( d->oldDragPos );
@@ -5286,11 +5332,19 @@
 	return;
 
     if ( item->d->container1 && d->firstContainer ) {
-	item->d->container1->items.removeRef( item );
+       //Special-case checking of the last item, since this may be
+       //called a few times for the same item.
+        if (item->d->container1->items.last() == item)
+            item->d->container1->items.removeLast();
+        else
+            item->d->container1->items.removeRef( item );
     }
     item->d->container1 = 0;
     if ( item->d->container2 && d->firstContainer ) {
-	item->d->container2->items.removeRef( item );
+        if (item->d->container2->items.last() == item)
+            item->d->container2->items.removeLast();
+        else
+            item->d->container2->items.removeRef( item );
     }
     item->d->container2 = 0;
 
diff -u qt-2.3.7_old/src/iconview/qiconview.h qt-2.3.7/src/iconview/qiconview.h
--- qt-2.3.7_old/src/iconview/qiconview.h	2004-06-13 22:29:56.000000000 +0200
+++ qt-2.3.7/src/iconview/qiconview.h	2004-06-13 22:33:32.000000000 +0200
@@ -444,6 +444,7 @@
     virtual void contentsDropEvent( QDropEvent *e );
 #endif
 
+    void bufferedPaintEvent( QPaintEvent* );
     virtual void resizeEvent( QResizeEvent* e );
     virtual void keyPressEvent( QKeyEvent *e );
     virtual void focusInEvent( QFocusEvent *e );