• 4020阅读
  • 6回复

[提问]QT 源码 嵌入式图形引擎 [复制链接]

上一主题 下一主题
离线铃溪
 

只看楼主 倒序阅读 楼主  发表于: 2017-07-21
                                                                                 QT 源码 嵌入式图形引擎
      
   在调用 QPainter 进行绘图时,会调用 QWidget 的 QPaintEngine 图形引擎,例如在 x11上
      QPaintEngine *QWidget::paintEngine() const
     {
       Q_D(const QWidget);
       if (qt_widget_paintengine()->isActive()) {
        if (d->extraPaintEngine)
             return d->extraPaintEngine;
        QWidget *self = const_cast<QWidget *>(this);
        self->d_func()->extraPaintEngine = new QX11PaintEngine();
        return d->extraPaintEngine;
      }
       return qt_widget_paintengine();
   }

   但是在 linux  嵌入式设备中,QRasterPaintEngine在4.8 的版本中被注释了
QPaintEngine *QWidget::paintEngine() const
{
    qWarning("QWidget::paintEngine: Should no longer be called");
    return 0; //##### @@@
//     if (!qt_widget_paintengine) {
//         qt_widget_paintengine = new QRasterPaintEngine();
//         qt_paintengine_cleanup_handler.set(&qt_widget_paintengine);
//     }
//     if (qt_widget_paintengine->isActive()) {
//         if (d->extraPaintEngine)
//             return d->extraPaintEngine;
//         const_cast<QWidget *>(this)->d_func()->extraPaintEngine = new QRasterPaintEngine();
//         return d->extraPaintEngine;
//     }
//    return qt_widget_paintengine;
}
请问一下各位大神,在qws   linux  嵌入式版本的qt上, QPaintEngine 图形引擎是哪一个啊,在哪里创建的啊??  
QT 版本: qt 4.8.5
离线misgn

只看该作者 1楼 发表于: 2017-07-25
为什么不重载paintEvent呢?
离线铃溪

只看该作者 2楼 发表于: 2017-07-25
最近在学习 QT 4.8 的源码图形的绘制过程
在 linux 嵌入式中 ,QPaintEngine 为 QRasterPaintEngine,QScreen为 QLinuxFbScreen,我想知道 QRasterPaintEngine 在哪里实例化的,这两个是怎么联系起来的 ? ?
离线大漠之鹰

只看该作者 3楼 发表于: 2017-07-26
你看看QWSWindowSurface,用的paintDevice是QImage,实际绘制是在这个image里边,绘制完成后会通过solid或者blit将这个界面直接显示在framebuffer上边。基于这个过程可以做很多优化,性能可以超过X11
本是后山人,偶作前堂客,醉舞经阁半卷书,坐井说天阔。大志戏功名,海斗量福祸,论到囊中羞涩时,怒指乾坤错
QQ:874164244
离线铃溪

只看该作者 4楼 发表于: 2017-07-26
谢谢,学习了,

后面还是看不太明白,谢谢大神了

/*QRasterPaintEngine 画点函数*/
void QRasterPaintEngine::drawPoints(const QPointF *points, int pointCount)
{
    Q_D(QRasterPaintEngine);
    QRasterPaintEngineState *s = state();

    ensurePen();
    if (!s->penData.blend)
        return;

    if (!s->flags.fast_pen) {
        QPaintEngineEx::drawPoints(points, pointCount);
        return;
    }

    QCosmeticStroker stroker(s, d->deviceRect, d->deviceRectUnclipped);
    stroker.drawPoints(points, pointCount);
}


void QCosmeticStroker::drawPoints(const QPoint *points, int num)
{
    const QPoint *end = points + num;
    while (points < end) {
        QPointF p = QPointF(*points) * state->matrix;
        drawPixel(this, qRound(p.x()), qRound(p.y()), 255);
        ++points;
    }

    blend(current_span, spans, &state->penData);
    current_span = 0;
}

inline void drawPixel(QCosmeticStroker *stroker, int x, int y, int coverage)
{
    const QRect &cl = stroker->clip;
    if (x < cl.x() || x > cl.right() || y < cl.y() || y > cl.bottom())
        return;

    int lastx = stroker->spans[stroker->current_span-1].x + stroker->spans[stroker->current_span-1].len ;
    int lasty = stroker->spans[stroker->current_span-1].y;

    if (stroker->current_span == QCosmeticStroker::NSPANS || y < lasty || (y == lasty && x < lastx)) {
        stroker->blend(stroker->current_span, stroker->spans, &stroker->state->penData);
        stroker->current_span = 0;
    }

    stroker->spans[stroker->current_span].x = ushort(x);
    stroker->spans[stroker->current_span].len = 1;
    stroker->spans[stroker->current_span].y = y;
    stroker->spans[stroker->current_span].coverage = coverage*stroker->opacity >> 8;
    ++stroker->current_span;
}
离线大漠之鹰

只看该作者 5楼 发表于: 2017-07-26
这个可以用自定义的画线画点函数来实现,这一部分我没有做修改,没有仔细研究过。一般情况下不需要重新实现,即便是X里边画线的优化也支持优化了垂直和水平的。在嵌入式里耗时比较多的是拷贝和填充,把这两个优化了性能就已经很不错了
本是后山人,偶作前堂客,醉舞经阁半卷书,坐井说天阔。大志戏功名,海斗量福祸,论到囊中羞涩时,怒指乾坤错
QQ:874164244
离线铃溪

只看该作者 6楼 发表于: 2017-07-26
谢谢啊,我再研究一下
快速回复
限100 字节
 
上一个 下一个