00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef QINTERNAL_P_H
00039 #define QINTERNAL_P_H
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef QT_H
00053 #include <qnamespace.h>
00054 #include <qrect.h>
00055 #endif // QT_H
00056
00057 class QWidget;
00058 class QPainter;
00059 class QPixmap;
00060
00061 class Q_EXPORT QSharedDoubleBuffer
00062 {
00063 public:
00064 enum DoubleBufferFlags {
00065 NoFlags = 0x00,
00066 InitBG = 0x01,
00067 Force = 0x02,
00068 Default = InitBG | Force
00069 };
00070 typedef uint DBFlags;
00071
00072 QSharedDoubleBuffer( DBFlags f = Default );
00073 QSharedDoubleBuffer( QWidget* widget,
00074 int x = 0, int y = 0, int w = -1, int h = -1,
00075 DBFlags f = Default );
00076 QSharedDoubleBuffer( QPainter* painter,
00077 int x = 0, int y = 0, int w = -1, int h = -1,
00078 DBFlags f = Default );
00079 QSharedDoubleBuffer( QWidget *widget, const QRect &r, DBFlags f = Default );
00080 QSharedDoubleBuffer( QPainter *painter, const QRect &r, DBFlags f = Default );
00081 ~QSharedDoubleBuffer();
00082
00083 bool begin( QWidget* widget, int x = 0, int y = 0, int w = -1, int h = -1 );
00084 bool begin( QPainter* painter, int x = 0, int y = 0, int w = -1, int h = -1);
00085 bool begin( QWidget* widget, const QRect &r );
00086 bool begin( QPainter* painter, const QRect &r );
00087 bool end();
00088
00089 QPainter* painter() const;
00090
00091 bool isActive() const;
00092 bool isBuffered() const;
00093 void flush();
00094
00095 static bool isDisabled() { return !dblbufr; }
00096 static void setDisabled( bool off ) { dblbufr = !off; }
00097
00098 static void cleanup();
00099
00100 private:
00101 enum DoubleBufferState {
00102 Active = 0x0100,
00103 BufferActive = 0x0200,
00104 ExternalPainter = 0x0400
00105 };
00106 typedef uint DBState;
00107
00108 QPixmap *getPixmap();
00109 void releasePixmap();
00110
00111 QWidget *wid;
00112 int rx, ry, rw, rh;
00113 DBFlags flags;
00114 DBState state;
00115
00116 QPainter *p, *external_p;
00117 QPixmap *pix;
00118
00119 static bool dblbufr;
00120 };
00121
00122 inline bool QSharedDoubleBuffer::begin( QWidget* widget, const QRect &r )
00123 { return begin( widget, r.x(), r.y(), r.width(), r.height() ); }
00124
00125 inline bool QSharedDoubleBuffer::begin( QPainter *painter, const QRect &r )
00126 { return begin( painter, r.x(), r.y(), r.width(), r.height() ); }
00127
00128 inline QPainter* QSharedDoubleBuffer::painter() const
00129 { return p; }
00130
00131 inline bool QSharedDoubleBuffer::isActive() const
00132 { return ( state & Active ); }
00133
00134 inline bool QSharedDoubleBuffer::isBuffered() const
00135 { return ( state & BufferActive ); }
00136
00137
00138 class QVirtualDestructor {
00139 public:
00140 virtual ~QVirtualDestructor() {}
00141 };
00142
00143 template <class T>
00144 class QAutoDeleter : public QVirtualDestructor {
00145 public:
00146 QAutoDeleter( T* p ) : ptr( p ) {}
00147 ~QAutoDeleter() { delete ptr; }
00148 private:
00149 T* ptr;
00150 };
00151
00152 template <class T>
00153 QAutoDeleter<T>* qAutoDeleter( T* p )
00154 {
00155 return new QAutoDeleter<T>( p );
00156 }
00157 #endif // QINTERNAL_P_H