void QBlitterPaintEnginePrivate::fillRect(const QRectF &rect, const QColor &color) { Q_Q(QBlitterPaintEngine); pmData->unmarkRasterOverlay(rect); QRectF targetRect = rect; if (hasXForm) targetRect = q->state()->matrix.mapRect(rect); const QClipData *clipData = clip(); if (clipData) { if (clipData->hasRectClip) { unlock(); pmData->blittable()->fillRect(targetRect & clipData->clipRect, color); } else if (clipData->hasRegionClip) { QVector<QRect> rects = clipData->clipRegion.rects(); for (int i = 0; i < rects.size(); ++i) { QRect intersectRect = rects.at(i).intersected(targetRect.toRect()); if (!intersectRect.isEmpty()) { unlock(); pmData->blittable()->fillRect(intersectRect, color); } } } } else { if (targetRect.x() >= 0 && targetRect.y() >= 0 && targetRect.width() <= q->paintDevice()->width() && targetRect.height() <= q->paintDevice()->height()) { unlock(); pmData->blittable()->fillRect(targetRect, color); } else { QRectF deviceRect(0, 0, q->paintDevice()->width(), q->paintDevice()->height()); unlock(); pmData->blittable()->fillRect(deviceRect & targetRect, color); } } }
void QBlitterPaintEnginePrivate::clipAndDrawPixmap(const QRectF &clip, const QRectF &target, const QPixmap &pm, const QRectF &sr) { QRectF intersectedRect = clip.intersected(target); if (intersectedRect.isEmpty()) return; QRectF source = sr; if (intersectedRect.size() != target.size()) { if (sr.size() == target.size()) { // no resize qreal deltaTop = target.top() - intersectedRect.top(); qreal deltaLeft = target.left() - intersectedRect.left(); qreal deltaBottom = target.bottom() - intersectedRect.bottom(); qreal deltaRight = target.right() - intersectedRect.right(); source.adjust(-deltaLeft, -deltaTop, -deltaRight, -deltaBottom); } else { // resize case qreal hFactor = sr.size().width() / target.size().width(); qreal vFactor = sr.size().height() / target.size().height(); qreal deltaTop = (target.top() - intersectedRect.top()) * vFactor; qreal deltaLeft = (target.left() - intersectedRect.left()) * hFactor; qreal deltaBottom = (target.bottom() - intersectedRect.bottom()) * vFactor; qreal deltaRight = (target.right() - intersectedRect.right()) * hFactor; source.adjust(-deltaLeft, -deltaTop, -deltaRight, -deltaBottom); } } pmData->unmarkRasterOverlay(intersectedRect); pmData->blittable()->drawPixmap(intersectedRect, pm, source); }
/** * This is borrowing the reference of the QDirectFbBlitter. You may not store this * pointer as a class member but must only use it locally. */ IDirectFBSurface *QDirectFbConvenience::dfbSurfaceForPlatformPixmap(QPlatformPixmap *handle) { QBlittablePlatformPixmap *blittablePmData = static_cast<QBlittablePlatformPixmap *>(handle); if (blittablePmData) { QBlittable *blittable = blittablePmData->blittable(); QDirectFbBlitter *dfbBlitter = static_cast<QDirectFbBlitter *>(blittable); return dfbBlitter->m_surface.data(); } return 0; }
inline void QBlitterPaintEnginePrivate::unlock() { pmData->blittable()->unlock(); }
inline void QBlitterPaintEnginePrivate::lock() { if (!pmData->blittable()->isLocked()) rasterBuffer->prepare(pmData->buffer()); }