00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <private/qt_x11_p.h>
00025
00026 #include <limits.h>
00027
00028 QRegion::QRegionData QRegion::shared_empty = {Q_ATOMIC_INIT(1), 0, 0, 0};
00029
00030 void QRegion::updateX11Region() const
00031 {
00032 d->rgn = XCreateRegion();
00033 if (!d->qt_rgn)
00034 return;
00035
00036 for(int i = 0; i < d->qt_rgn->numRects; ++i) {
00037 XRectangle r;
00038 const QRect &rect = d->qt_rgn->rects.at(i);
00039 r.x = qMax(SHRT_MIN, rect.x());
00040 r.y = qMax(SHRT_MIN, rect.y());
00041 r.width = qMin((int)USHRT_MAX, rect.width());
00042 r.height = qMin((int)USHRT_MAX, rect.height());
00043 XUnionRectWithRegion(&r, d->rgn, d->rgn);
00044 }
00045 }
00046
00047 void *QRegion::clipRectangles(int &num) const
00048 {
00049 if (!d->xrectangles && !(d == &shared_empty || d->qt_rgn->numRects == 0)) {
00050 XRectangle *r = static_cast<XRectangle*>(malloc(d->qt_rgn->numRects * sizeof(XRectangle)));
00051 d->xrectangles = r;
00052 for(int i = 0; i < d->qt_rgn->numRects; ++i) {
00053 const QRect &rect = d->qt_rgn->rects.at(i);
00054 r->x = qMax(SHRT_MIN, rect.x());
00055 r->y = qMax(SHRT_MIN, rect.y());
00056 r->width = qMin((int)USHRT_MAX, rect.width());
00057 r->height = qMin((int)USHRT_MAX, rect.height());
00058 ++r;
00059 }
00060 }
00061 if (d == &shared_empty || d->qt_rgn->numRects == 0)
00062 num = 0;
00063 else
00064 num = d->qt_rgn->numRects;
00065 return d->xrectangles;
00066 }