QDirectFBPixmapData::~QDirectFBPixmapData() { unlockDirectFB(); if (surface) surface->Release(surface); delete engine; }
void QDirectFBPaintDevice::lockDirectFB(uint flags) { if (!(lock & flags)) { if (lock) unlockDirectFB(); if ((mem = QDirectFBScreen::lockSurface(dfbSurface, flags, &bpl))) { const QSize s = size(); lockedImage = new QImage(mem, s.width(), s.height(), bpl, QDirectFBScreen::getImageFormat(dfbSurface)); lock = flags; Q_ASSERT(mem); } else { lock = 0; } } }
void QDirectFBPixmapData::copy(const QPixmapData *data, const QRect &rect) { if (data->classId() != DirectFBClass) { QPixmapData::copy(data, rect); return; } unlockDirectFB(); IDirectFBSurface *src = static_cast<const QDirectFBPixmapData*>(data)->directFBSurface(); alpha = data->hasAlphaChannel(); format = (alpha ? QDirectFBScreen::instance()->alphaPixmapFormat() : QDirectFBScreen::instance()->pixelFormat()); dfbSurface = screen->createDFBSurface(rect.size(), format, QDirectFBScreen::TrackSurface); if (!dfbSurface) { qWarning("QDirectFBPixmapData::copy()"); invalidate(); return; } if (alpha) { dfbSurface->Clear(dfbSurface, 0, 0, 0, 0); dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_BLEND_ALPHACHANNEL); } else { dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX); } const DFBRectangle blitRect = { rect.x(), rect.y(), rect.width(), rect.height() }; DFBResult result = dfbSurface->Blit(dfbSurface, src, &blitRect, 0, 0); #if (Q_DIRECTFB_VERSION >= 0x010000) dfbSurface->ReleaseSource(dfbSurface); #endif if (result != DFB_OK) { DirectFBError("QDirectFBPixmapData::copy()", result); invalidate(); return; } setSerialNumber(++global_ser_no); }
QDirectFBPixmapData::~QDirectFBPixmapData() { unlockDirectFB(); if (dfbSurface && QDirectFBScreen::instance()) screen->releaseDFBSurface(dfbSurface); }