1. 程式人生 > >Qt中跟蹤QPainter::drawRect的實現

Qt中跟蹤QPainter::drawRect的實現


void QPainter::drawRects(const QRectF *rects, int rectCount)
{
#ifdef QT_DEBUG_DRAW
    if (qt_show_painter_debug_output)
        printf("QPainter::drawRects(), count=%d\n", rectCount);
#endif
    Q_D(QPainter);

    if (!d->engine) {
        qWarning("QPainter::drawRects: Painter not active");
        return;
    }

    if (rectCount <= 0)
        return;

//(H) QPaintEngineEx *extended;型別
    if (d->extended) {
        d->extended->drawRects(rects, rectCount);
        return;
    }

    d->updateState(d->state);
// ...............
}

//////////////////////////////////////////////////////
// 跟蹤drawRect
1. painter.drawRect(rcF);[使用者呼叫]
2. QPainter::drawRects[在qpainter.cpp中]
3. 可能有2中情況
<3.1>d->extended->drawRects(rects, rectCount);
(d的型別為QPainterPrivate)
(extended的型別為QPaintEngineEx)
<3.2>d->engine->drawRects(rects, rectCount);[在qpainter.cpp中]
(engine型別為QPaintEngine, 並且根據不同的平臺為不同的型別)
(例:在X11平臺就為QX11PaintEngine[在qpaintengine_x11_p.h中])
(在Windows平臺就為QRasterPaintEngine[在qpainterengine_raster.cpp中])

///////////////////////////////////////////////
// 假設在Linux平臺使用的是X11
4. QX11PaintEngine::drawRects[在qpaintengine_x11.cpp中]
5. XFillRectangles[qpaintengine_x11.cpp]
(直接使用X11函式繪圖)


///////////////////////////////////////////////
// 假設在Windows平臺用的是rasterizer
4.QRasterPaintEngine::drawRects[在qpaintengine_raster.cpp中]
5.QRasterPaintEngine::stroke[在qpaintengine_raster.cpp中]
6.d->rasterizer->rasterizeLine
(d的型別為QRasterPaintEnginePrivate;rasterizer的型別為QRasterizer;)
故上面這句程式碼實際呼叫的函式為
QRasterizer::rasterizeLine[在qrasterizer.cpp中]
最終繪製到一個QImage,並通過BitBlt繪製到Windows的HDC上面。