Ignore:
Timestamp:
Aug 2, 2010, 9:27:30 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.3 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp

    r651 r769  
    6262    , flipFlags(flip)
    6363    , boundingRectFlip(scr->directFBFlags() & QDirectFBScreen::BoundingRectFlip)
     64    , flushPending(false)
    6465{
    6566#ifdef QT_NO_DIRECTFB_WM
     
    8182    , flipFlags(flip)
    8283    , boundingRectFlip(scr->directFBFlags() & QDirectFBScreen::BoundingRectFlip)
     84    , flushPending(false)
    8385{
    8486    SurfaceFlags flags = 0;
     
    9395        flags = Buffered;
    9496    }
    95 #else
    96     noSystemBackground = widget && widget->testAttribute(Qt::WA_NoSystemBackground);
    97     if (noSystemBackground)
    98         flags &= ~Opaque;
    9997#endif
    10098    setSurfaceFlags(flags);
     
    135133        qFatal("QDirectFBWindowSurface: Unable to get primary display layer!");
    136134
     135    updateIsOpaque();
     136
    137137    DFBWindowDescription description;
    138138    memset(&description, 0, sizeof(DFBWindowDescription));
    139139
     140    description.flags = DWDESC_CAPS|DWDESC_HEIGHT|DWDESC_WIDTH|DWDESC_POSX|DWDESC_POSY|DWDESC_SURFACE_CAPS|DWDESC_PIXELFORMAT;
    140141    description.caps = DWCAPS_NODECORATION;
    141     description.flags = DWDESC_CAPS|DWDESC_SURFACE_CAPS|DWDESC_PIXELFORMAT|DWDESC_HEIGHT|DWDESC_WIDTH|DWDESC_POSX|DWDESC_POSY;
    142 #if (Q_DIRECTFB_VERSION >= 0x010200)
    143     description.flags |= DWDESC_OPTIONS;
    144 #endif
    145 
    146     if (noSystemBackground) {
     142    description.surface_caps = DSCAPS_NONE;
     143    imageFormat = screen->pixelFormat();
     144
     145    if (!(surfaceFlags() & Opaque)) {
     146        imageFormat = screen->alphaPixmapFormat();
    147147        description.caps |= DWCAPS_ALPHACHANNEL;
    148148#if (Q_DIRECTFB_VERSION >= 0x010200)
     149        description.flags |= DWDESC_OPTIONS;
    149150        description.options |= DWOP_ALPHACHANNEL;
    150151#endif
    151152    }
    152 
     153    description.pixelformat = QDirectFBScreen::getSurfacePixelFormat(imageFormat);
    153154    description.posx = rect.x();
    154155    description.posy = rect.y();
    155156    description.width = rect.width();
    156157    description.height = rect.height();
    157     description.surface_caps = DSCAPS_NONE;
     158
     159    if (QDirectFBScreen::isPremultiplied(imageFormat))
     160        description.surface_caps = DSCAPS_PREMULTIPLIED;
     161
    158162    if (screen->directFBFlags() & QDirectFBScreen::VideoOnly)
    159163        description.surface_caps |= DSCAPS_VIDEOONLY;
    160     const QImage::Format format = (noSystemBackground ? screen->alphaPixmapFormat() : screen->pixelFormat());
    161     description.pixelformat = QDirectFBScreen::getSurfacePixelFormat(format);
    162     if (QDirectFBScreen::isPremultiplied(format))
    163         description.surface_caps = DSCAPS_PREMULTIPLIED;
    164164
    165165    DFBResult result = layer->CreateWindow(layer, &description, &dfbWindow);
     
    183183    Q_ASSERT(!dfbSurface);
    184184    dfbWindow->GetSurface(dfbWindow, &dfbSurface);
    185     updateFormat();
    186185}
    187186
     
    268267        } else { // mode == Offscreen
    269268            if (!dfbSurface) {
    270                 dfbSurface = screen->createDFBSurface(rect.size(), screen->pixelFormat(), QDirectFBScreen::DontTrackSurface);
     269                dfbSurface = screen->createDFBSurface(rect.size(), surfaceFlags() & Opaque ? screen->pixelFormat() : screen->alphaPixmapFormat(),
     270                                                      QDirectFBScreen::DontTrackSurface);
    271271            }
    272272        }
     
    275275#endif
    276276    }
    277     if (oldSurface != dfbSurface)
    278         updateFormat();
     277    if (oldSurface != dfbSurface) {
     278        imageFormat = dfbSurface ? QDirectFBScreen::getImageFormat(dfbSurface) : QImage::Format_Invalid;
     279    }
    279280
    280281    if (oldRect.size() != rect.size()) {
     
    297298        sibling = *reinterpret_cast<QDirectFBWindowSurface *const*>(state.constData());
    298299        Q_ASSERT(sibling);
    299         sibling->setSurfaceFlags(surfaceFlags());
    300     }
    301 }
    302 
    303 static inline void scrollSurface(IDirectFBSurface *surface, const QRect &r, int dx, int dy)
    304 {
     300        setSurfaceFlags(sibling->surfaceFlags());
     301    }
     302}
     303
     304bool QDirectFBWindowSurface::scroll(const QRegion &region, int dx, int dy)
     305{
     306    if (!dfbSurface || !(flipFlags & DSFLIP_BLIT) || region.rectCount() != 1)
     307        return false;
     308    if (flushPending) {
     309        dfbSurface->Flip(dfbSurface, 0, DSFLIP_BLIT);
     310    } else {
     311        flushPending = true;
     312    }
     313    dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
     314    const QRect r = region.boundingRect();
    305315    const DFBRectangle rect = { r.x(), r.y(), r.width(), r.height() };
    306     surface->Blit(surface, surface, &rect, r.x() + dx, r.y() + dy);
    307     const DFBRegion region = { rect.x + dx, rect.y + dy, r.right() + dx, r.bottom() + dy };
    308     surface->Flip(surface, &region, DSFLIP_BLIT);
    309 }
    310 
    311 bool QDirectFBWindowSurface::scroll(const QRegion &region, int dx, int dy)
    312 {
    313     if (!dfbSurface || !(flipFlags & DSFLIP_BLIT) || region.isEmpty())
    314         return false;
    315     dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
    316     if (region.rectCount() == 1) {
    317         scrollSurface(dfbSurface, region.boundingRect(), dx, dy);
    318     } else {
    319         const QVector<QRect> rects = region.rects();
    320         const int n = rects.size();
    321         for (int i=0; i<n; ++i) {
    322             scrollSurface(dfbSurface, rects.at(i), dx, dy);
    323         }
    324     }
     316    dfbSurface->Blit(dfbSurface, dfbSurface, &rect, r.x() + dx, r.y() + dy);
    325317    return true;
    326318}
     
    360352    const QRect windowGeometry = geometry();
    361353#ifdef QT_DIRECTFB_WM
    362     const bool wasNoSystemBackground = noSystemBackground;
    363     noSystemBackground = win->testAttribute(Qt::WA_NoSystemBackground);
    364354    quint8 currentOpacity;
    365355    Q_ASSERT(dfbWindow);
     
    369359    }
    370360
    371     setOpaque(noSystemBackground || windowOpacity != 0xff);
    372     if (wasNoSystemBackground != noSystemBackground) {
    373         releaseSurface();
    374         dfbWindow->Release(dfbWindow);
    375         dfbWindow = 0;
    376         createWindow(windowGeometry);
    377         win->update();
    378         return;
    379     }
    380361    screen->flipSurface(dfbSurface, flipFlags, region, offset);
    381362#else
    382     setOpaque(windowOpacity != 0xff);
     363    setOpaque(windowOpacity == 0xff);
    383364    if (mode == Offscreen) {
    384365        screen->exposeRegion(region.translated(offset + geometry().topLeft()), 0);
     
    397378    }
    398379#endif
     380    flushPending = false;
    399381}
    400382
     
    404386        engine = new QDirectFBPaintEngine(this);
    405387    }
     388    flushPending = true;
    406389}
    407390
     
    443426}
    444427
    445 void QDirectFBWindowSurface::updateFormat()
    446 {
    447     imageFormat = dfbSurface ? QDirectFBScreen::getImageFormat(dfbSurface) : QImage::Format_Invalid;
    448 }
    449 
    450428void QDirectFBWindowSurface::releaseSurface()
    451429{
     
    466444}
    467445
     446void QDirectFBWindowSurface::updateIsOpaque()
     447{
     448    const QWidget *win = window();
     449    Q_ASSERT(win);
     450    if (win->testAttribute(Qt::WA_OpaquePaintEvent) || win->testAttribute(Qt::WA_PaintOnScreen)) {
     451        setOpaque(true);
     452        return;
     453    }
     454
     455    if (qFuzzyCompare(static_cast<float>(win->windowOpacity()), 1.0f)) {
     456        const QPalette &pal = win->palette();
     457
     458        if (win->autoFillBackground()) {
     459            const QBrush &autoFillBrush = pal.brush(win->backgroundRole());
     460            if (autoFillBrush.style() != Qt::NoBrush && autoFillBrush.isOpaque()) {
     461                setOpaque(true);
     462                return;
     463            }
     464        }
     465
     466        if (win->isWindow() && !win->testAttribute(Qt::WA_NoSystemBackground)) {
     467            const QBrush &windowBrush = win->palette().brush(QPalette::Window);
     468            if (windowBrush.style() != Qt::NoBrush && windowBrush.isOpaque()) {
     469                setOpaque(true);
     470                return;
     471            }
     472        }
     473    }
     474    setOpaque(false);
     475}
    468476
    469477QT_END_NAMESPACE
    470478
    471479#endif // QT_NO_QWS_DIRECTFB
    472 
    473 
Note: See TracChangeset for help on using the changeset viewer.