查看完整版本: [-- QT 源码 嵌入式图形引擎 --]

QTCN开发网 -> Qt嵌入式开发 -> QT 源码 嵌入式图形引擎 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

铃溪 2017-07-21 11:42

QT 源码 嵌入式图形引擎

                                                                                 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 2017-07-25 15:46
为什么不重载paintEvent呢?

铃溪 2017-07-25 19:19
最近在学习 QT 4.8 的源码图形的绘制过程
在 linux 嵌入式中 ,QPaintEngine 为 QRasterPaintEngine,QScreen为 QLinuxFbScreen,我想知道 QRasterPaintEngine 在哪里实例化的,这两个是怎么联系起来的 ? ?

大漠之鹰 2017-07-26 10:07
你看看QWSWindowSurface,用的paintDevice是QImage,实际绘制是在这个image里边,绘制完成后会通过solid或者blit将这个界面直接显示在framebuffer上边。基于这个过程可以做很多优化,性能可以超过X11

铃溪 2017-07-26 16:23
谢谢,学习了,

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

/*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;
}

大漠之鹰 2017-07-26 17:01
这个可以用自定义的画线画点函数来实现,这一部分我没有做修改,没有仔细研究过。一般情况下不需要重新实现,即便是X里边画线的优化也支持优化了垂直和水平的。在嵌入式里耗时比较多的是拷贝和填充,把这两个优化了性能就已经很不错了

铃溪 2017-07-26 17:46
谢谢啊,我再研究一下


查看完整版本: [-- QT 源码 嵌入式图形引擎 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled