void QSvgTinyDocument::draw(QPainter *p, const QRectF &bounds) { if (m_time.isNull()) { m_time.start(); } if (displayMode() == QSvgNode::NoneMode) return; p->save(); //sets default style on the painter //### not the most optimal way mapSourceToTarget(p, bounds); QPen pen(Qt::NoBrush, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); pen.setMiterLimit(4); p->setPen(pen); p->setBrush(Qt::black); p->setRenderHint(QPainter::Antialiasing); p->setRenderHint(QPainter::SmoothPixmapTransform); QList<QSvgNode*>::iterator itr = m_renderers.begin(); applyStyle(p, m_states); while (itr != m_renderers.end()) { QSvgNode *node = *itr; if ((node->isVisible()) && (node->displayMode() != QSvgNode::NoneMode)) node->draw(p, m_states); ++itr; } revertStyle(p, m_states); p->restore(); }
void QSvgTinyDocument::draw(QPainter *p, const QString &id, const QRectF &bounds) { QSvgNode *node = scopeNode(id); if (!node) { qDebug("Couldn't find node %s. Skipping rendering.", qPrintable(id)); return; } if (m_time.isNull()) { m_time.start(); } if (node->displayMode() == QSvgNode::NoneMode) return; p->save(); const QRectF elementBounds = node->transformedBounds(); mapSourceToTarget(p, bounds, elementBounds); QTransform originalTransform = p->worldTransform(); //XXX set default style on the painter QPen pen(Qt::NoBrush, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); pen.setMiterLimit(4); p->setPen(pen); p->setBrush(Qt::black); p->setRenderHint(QPainter::Antialiasing); p->setRenderHint(QPainter::SmoothPixmapTransform); QStack<QSvgNode*> parentApplyStack; QSvgNode *parent = node->parent(); while (parent) { parentApplyStack.push(parent); parent = parent->parent(); } for (int i = parentApplyStack.size() - 1; i >= 0; --i) parentApplyStack[i]->applyStyle(p, m_states); // Reset the world transform so that our parents don't affect // the position QTransform currentTransform = p->worldTransform(); p->setWorldTransform(originalTransform); node->draw(p, m_states); p->setWorldTransform(currentTransform); for (int i = 0; i < parentApplyStack.size(); ++i) parentApplyStack[i]->revertStyle(p, m_states); //p->fillRect(bounds.adjusted(-5, -5, 5, 5), QColor(0, 0, 255, 100)); p->restore(); }
void QSvgG::draw(QPainter *p, QSvgExtraStates &states) { QList<QSvgNode*>::iterator itr = m_renderers.begin(); applyStyle(p, states); while (itr != m_renderers.end()) { QSvgNode *node = *itr; if ((node->isVisible()) && (node->displayMode() != QSvgNode::NoneMode)) node->draw(p, states); ++itr; } revertStyle(p, states); }
void QSvgSwitch::draw(QPainter *p, QSvgExtraStates &states) { QList<QSvgNode*>::iterator itr = m_renderers.begin(); applyStyle(p, states); while (itr != m_renderers.end()) { QSvgNode *node = *itr; if (node->isVisible() && (node->displayMode() != QSvgNode::NoneMode)) { const QStringList &features = node->requiredFeatures(); const QStringList &extensions = node->requiredExtensions(); const QStringList &languages = node->requiredLanguages(); const QStringList &formats = node->requiredFormats(); const QStringList &fonts = node->requiredFonts(); bool okToRender = true; if (!features.isEmpty()) { QStringList::const_iterator sitr = features.constBegin(); for (; sitr != features.constEnd(); ++sitr) { if (!isSupportedSvgFeature(*sitr)) { okToRender = false; break; } } } if (okToRender && !extensions.isEmpty()) { QStringList::const_iterator sitr = extensions.constBegin(); for (; sitr != extensions.constEnd(); ++sitr) { if (!isSupportedSvgExtension(*sitr)) { okToRender = false; break; } } } if (okToRender && !languages.isEmpty()) { QStringList::const_iterator sitr = languages.constBegin(); okToRender = false; for (; sitr != languages.constEnd(); ++sitr) { if ((*sitr).startsWith(m_systemLanguagePrefix)) { okToRender = true; break; } } } if (okToRender && !formats.isEmpty()) { okToRender = false; } if (okToRender && !fonts.isEmpty()) { okToRender = false; } if (okToRender) { node->draw(p, states); break; } } ++itr; } revertStyle(p, states); }