标题:QT 源码 嵌入式图形引擎
作者:铃溪
日期:2017-07-21 11:42
内容:
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(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();
//&nb ..
#1 [misgn 07-25 15:46]
为什么不重载paintEvent呢?
#2 [铃溪 07-25 19:19]
最近在学习 QT 4.8 的源码图形的绘制过程
在 linux 嵌入式中 ,QPaintEngine 为 QRasterPaintEngine,QScreen为 QLinuxFbScreen,我想知道 QRasterPaintEngine 在哪里实例化的,这两个是怎么联系起来的 ? ?
#3 [大漠之鹰 07-26 10:07]
你看看QWSWindowSurface,用的paintDevice是QImage,实际绘制是在这个image里边,绘制完成后会通过solid或者blit将这个界面直接显示在framebuffer上边。基于这个过程可以做很多优化,性能可以超过X11
#4 [铃溪 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.x + stroker->spans.len ;
int lasty = stroker->spans.y;
if (stroker->current_span == QCosmeticStroker::NSP ..
#5 [大漠之鹰 07-26 17:01]
这个可以用自定义的画线画点函数来实现,这一部分我没有做修改,没有仔细研究过。一般情况下不需要重新实现,即便是X里边画线的优化也支持优化了垂直和水平的。在嵌入式里耗时比较多的是拷贝和填充,把这两个优化了性能就已经很不错了