📄 qpaintengine.cpp
字号:
p.drawPixmap(0, y, *tile, 0, 0, tile->width(), y); y *= 2; }}void qt_draw_tile(QPaintEngine *gc, qreal x, qreal y, qreal w, qreal h, const QPixmap &pixmap, qreal xOffset, qreal yOffset){ qreal yPos, xPos, drawH, drawW, yOff, xOff; yPos = y; yOff = yOffset; while(yPos < y + h) { drawH = pixmap.height() - yOff; // Cropping first row if (yPos + drawH > y + h) // Cropping last row drawH = y + h - yPos; xPos = x; xOff = xOffset; while(xPos < x + w) { drawW = pixmap.width() - xOff; // Cropping first column if (xPos + drawW > x + w) // Cropping last column drawW = x + w - xPos; if (drawW > 0 && drawH > 0) gc->drawPixmap(QRectF(xPos, yPos, drawW, drawH), pixmap, QRectF(xOff, yOff, drawW, drawH)); xPos += drawW; xOff = 0; } yPos += drawH; yOff = 0; }}/*! Reimplement this function to draw the \a pixmap in the given \a rect, starting at the given \a p. The pixmap will be drawn repeatedly until the \a rect is filled.*/void QPaintEngine::drawTiledPixmap(const QRectF &rect, const QPixmap &pixmap, const QPointF &p){ int sw = pixmap.width(); int sh = pixmap.height(); if (sw*sh < 8192 && sw*sh < 16*rect.width()*rect.height()) { int tw = sw, th = sh; while (tw*th < 32678 && tw < rect.width()/2) tw *= 2; while (tw*th < 32678 && th < rect.height()/2) th *= 2; QPixmap tile; if (pixmap.depth() == 1) { tile = QBitmap(tw, th); } else { tile = QPixmap(tw, th); if (pixmap.hasAlphaChannel()) tile.fill(Qt::transparent); } qt_fill_tile(&tile, pixmap); qt_draw_tile(this, rect.x(), rect.y(), rect.width(), rect.height(), tile, p.x(), p.y()); } else { qt_draw_tile(this, rect.x(), rect.y(), rect.width(), rect.height(), pixmap, p.x(), p.y()); }}/*! \fn void QPaintEngine::drawImage(const QRectF &rectangle, const QImage &image, const QRectF &sr, Qt::ImageConversionFlags flags) Reimplement this function to draw the part of the \a image specified by the \a sr rectangle in the given \a rectangle using the given conversion flags \a flags, to convert it to a pixmap.*/void QPaintEngine::drawImage(const QRectF &r, const QImage &image, const QRectF &sr, Qt::ImageConversionFlags flags){ QRectF baseSize(0, 0, image.width(), image.height()); QImage im = image; if (baseSize != sr) im = im.copy(qFloor(sr.x()), qFloor(sr.y()), qCeil(sr.width()), qCeil(sr.height())); if (im.depth() == 1) im = im.convertToFormat(QImage::Format_RGB32); QPixmap pm = QPixmap::fromImage(im, flags); drawPixmap(r, pm, QRectF(QPointF(0, 0), pm.size()));}/*! \fn Type QPaintEngine::type() const Reimplement this function to return the paint engine \l{Type}.*//*! \fn void QPaintEngine::fix_neg_rect(int *x, int *y, int *w, int *h); \internal*//*! \fn bool QPaintEngine::testDirty(DirtyFlags df) \internal*//*! \fn void QPaintEngine::clearDirty(DirtyFlags df) \internal*//*! \fn void QPaintEngine::setDirty(DirtyFlags df) \internal*//*! \fn bool QPaintEngine::hasFeature(PaintEngineFeatures feature) const Returns true if the paint engine supports the specified \a feature; otherwise returns false.*//*! \fn void QPaintEngine::updateState(const QPaintEngineState &state) Reimplement this function to update the state of a paint engine. When implemented, this function is responsible for checking the paint engine's current \a state and update the properties that are changed. Use the QPaintEngineState::state() function to find out which properties that must be updated, then use the corresponding \l {GetFunction}{get function} to retrieve the current values for the given properties. \sa QPaintEngineState*//*! Creates a paint engine with the featureset specified by \a caps.*/QPaintEngine::QPaintEngine(PaintEngineFeatures caps) : state(0), gccaps(caps), active(0), selfDestruct(false), d_ptr(new QPaintEnginePrivate){ d_ptr->q_ptr = this;}/*! \internal*/QPaintEngine::QPaintEngine(QPaintEnginePrivate &dptr, PaintEngineFeatures caps) : state(0), gccaps(caps), active(0), selfDestruct(false), d_ptr(&dptr){ d_ptr->q_ptr = this;}/*! Destroys the paint engine.*/QPaintEngine::~QPaintEngine(){ delete d_ptr;}/*! Returns the paint engine's painter.*/QPainter *QPaintEngine::painter() const{ return state ? state->painter() : 0;}/*! The default implementation ignores the \a path and does nothing.*/void QPaintEngine::drawPath(const QPainterPath &){ if (hasFeature(PainterPaths)) { qWarning("QPaintEngine::drawPath: Must be implemented when feature PainterPaths is set"); }}/*! This function draws the text item \a textItem at position \a p. The default implementation of this function converts the text to a QPainterPath and paints the resulting path.*/void QPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem){ const QTextItemInt &ti = static_cast<const QTextItemInt &>(textItem); QPainterPath path;#ifndef Q_WS_MAC path.setFillRule(Qt::WindingFill);#endif if (ti.num_glyphs) ti.fontEngine->addOutlineToPath(p.x(), p.y(), ti.glyphs, ti.num_glyphs, &path, ti.flags); if (!path.isEmpty()) { painter()->save(); painter()->setRenderHint(QPainter::Antialiasing, bool((painter()->renderHints() & QPainter::TextAntialiasing) && !(painter()->font().styleStrategy() & QFont::NoAntialias))); painter()->setBrush(state->pen().brush()); painter()->setPen(Qt::NoPen); painter()->drawPath(path); painter()->restore(); }}/*! The default implementation splits the list of lines in \a lines into \a lineCount separate calls to drawPath() or drawPolygon() depending on the feature set of the paint engine.*/void QPaintEngine::drawLines(const QLineF *lines, int lineCount){ for (int i=0; i<lineCount; ++i) { QPointF pts[2] = { lines[i].p1(), lines[i].p2() }; drawPolygon(pts, 2, PolylineMode); }}/*! \overload The default implementation converts the first \a lineCount lines in \a lines to a QLineF and calls the floating point version of this function.*/void QPaintEngine::drawLines(const QLine *lines, int lineCount){ struct PointF { qreal x; qreal y; }; struct LineF { PointF p1; PointF p2; }; Q_ASSERT(sizeof(PointF) == sizeof(QPointF)); Q_ASSERT(sizeof(LineF) == sizeof(QLineF)); LineF fl[256]; while (lineCount) { int i = 0; while (i < lineCount && i < 256) { fl[i].p1.x = lines[i].x1(); fl[i].p1.y = lines[i].y1(); fl[i].p2.x = lines[i].x2(); fl[i].p2.y = lines[i].y2(); ++i; } drawLines((QLineF *)(void *)fl, i); lines += i; lineCount -= i; }}/*! \overload The default implementation converts the first \a rectCount rectangles in the buffer \a rects to a QRectF and calls the floating point version of this function.*/void QPaintEngine::drawRects(const QRect *rects, int rectCount){ struct RectF { qreal x; qreal y; qreal w; qreal h; }; Q_ASSERT(sizeof(RectF) == sizeof(QRectF)); RectF fr[256]; while (rectCount) { int i = 0; while (i < rectCount && i < 256) { fr[i].x = rects[i].x(); fr[i].y = rects[i].y(); fr[i].w = rects[i].width(); fr[i].h = rects[i].height(); ++i; } drawRects((QRectF *)(void *)fr, i); rects += i; rectCount -= i; }}/*! Draws the first \a rectCount rectangles in the buffer \a rects. The default implementation of this function calls drawPath() or drawPolygon() depending on the feature set of the paint engine.*/void QPaintEngine::drawRects(const QRectF *rects, int rectCount){ if (hasFeature(PainterPaths) && !state->penNeedsResolving() && !state->brushNeedsResolving()) { for (int i=0; i<rectCount; ++i) { QPainterPath path; path.addRect(rects[i]); if (path.isEmpty()) continue; drawPath(path); } } else { for (int i=0; i<rectCount; ++i) { QRectF rf = rects[i]; QPointF pts[4] = { QPointF(rf.x(), rf.y()), QPointF(rf.x() + rf.width(), rf.y()), QPointF(rf.x() + rf.width(), rf.y() + rf.height()), QPointF(rf.x(), rf.y() + rf.height()) }; drawPolygon(pts, 4, ConvexMode); } }}/*! \internal Sets the paintdevice that this engine operates on to \a device*/void QPaintEngine::setPaintDevice(QPaintDevice *device){ d_func()->pdev = device;}/*! Returns the device that this engine is painting on, if painting is active; otherwise returns 0.*/QPaintDevice *QPaintEngine::paintDevice() const{ return d_func()->pdev;}#ifdef Q_WS_WIN/*! \internal Empty default implementation.*/HDC QPaintEngine::getDC() const{ return 0;}/*! \internal Empty default implementation.*/void QPaintEngine::releaseDC(HDC) const{}#endif/*! \internal Returns the offset from the painters origo to the engines origo. This value is used by QPainter for engines who have internal double buffering. This function only makes sense when the engine is active.*/QPoint QPaintEngine::coordinateOffset() const{ return QPoint();}/*! \internal Sets the system clip for this engine. The system clip defines the basis area that the engine has to draw in. All clips that are set must be an intersection with the system clip. Reset the systemclip to no clip by setting an empty region.*/void QPaintEngine::setSystemClip(const QRegion ®ion){ if (isActive()) { qWarning("QPaintEngine::setSystemClip: Should not be changed while engine is active"); return; } d_func()->systemClip = region;}/*! \internal Returns the system clip. The system clip is read only while the painter is active. An empty region indicates that system clip is not in use.*/QRegion QPaintEngine::systemClip() const{ return d_func()->systemClip;}/*! \internal Sets the target rect for drawing within the backing store. This function should ONLY be used by the backing store.*/void QPaintEngine::setSystemRect(const QRect &rect){ if (isActive()) { qWarning("QPaintEngine::setSystemRect: Should not be changed while engine is active"); return; } d_func()->systemRect = rect;}/*! \internal Retreives the rect for drawing within the backing store. This function should ONLY be used by the backing store. */QRect QPaintEngine::systemRect() const{ return d_func()->systemRect;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -