Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qsvgnode.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qsvgnode_p.h"
6
7#include <QLoggingCategory>
8#include<QElapsedTimer>
9#include <QtGui/qimageiohandler.h>
10
11#include "qdebug.h"
12#include "qstack.h"
13
14#include <QtGui/private/qoutlinemapper_p.h>
15
17
19
20Q_LOGGING_CATEGORY(lcSvgTiming, "qt.svg.timing")
21
22#if !defined(QT_SVG_SIZE_LIMIT)
23# define QT_SVG_SIZE_LIMIT QT_RASTER_COORD_LIMIT
24#endif
25
27 : m_parent(parent),
28 m_visible(true),
29 m_displayMode(BlockMode)
30{
31}
32
37
39{
40#ifndef QT_NO_DEBUG
41 QElapsedTimer qtSvgTimer; qtSvgTimer.start();
42#endif
43
44 if (shouldDrawNode(p, states)) {
46 QSvgNode *maskNode = this->hasMask() ? document()->namedNode(this->maskId()) : nullptr;
47 QSvgFilterContainer *filterNode = this->hasFilter() ? static_cast<QSvgFilterContainer*>(document()->namedNode(this->filterId()))
48 : nullptr;
49 if (filterNode && filterNode->type() == QSvgNode::Filter && filterNode->supported()) {
50 QTransform xf = p->transform();
51 p->resetTransform();
52 QRectF localRect = bounds(p, states);
53 QRectF boundsRect = xf.mapRect(localRect);
54 p->setTransform(xf);
55 QImage proxy = drawIntoBuffer(p, states, boundsRect.toRect());
56 proxy = filterNode->applyFilter(this, proxy, p, localRect);
57
58 boundsRect = QRectF(proxy.offset(), proxy.size());
59 localRect = p->transform().inverted().mapRect(boundsRect);
60 if (maskNode && maskNode->type() == QSvgNode::Mask) {
61 QImage mask = static_cast<QSvgMask*>(maskNode)->createMask(p, states, localRect, &boundsRect);
63 }
65
66 } else if (maskNode && maskNode->type() == QSvgNode::Mask) {
67 QRectF boundsRect;
68 QImage mask = static_cast<QSvgMask*>(maskNode)->createMask(p, states, this, &boundsRect);
69 drawWithMask(p, states, mask, boundsRect.toRect());
70 } else {
73 else
75 }
77 }
78
79#ifndef QT_NO_DEBUG
80 if (Q_UNLIKELY(lcSvgTiming().isDebugEnabled()))
81 qCDebug(lcSvgTiming) << "Drawing" << typeName() << "took" << (qtSvgTimer.nsecsElapsed() / 1000000.0f) << "ms";
82#endif
83}
84
86{
87 qreal oldOpacity = p->opacity();
88 if (p->brush().style() != Qt::NoBrush) {
89 QPen oldPen = p->pen();
90 p->setPen(Qt::NoPen);
91 p->setOpacity(oldOpacity * states.fillOpacity);
92
94
95 p->setPen(oldPen);
96 }
97 if (p->pen() != Qt::NoPen && p->pen().brush() != Qt::NoBrush && p->pen().widthF() != 0) {
98 QBrush oldBrush = p->brush();
99 p->setOpacity(oldOpacity * states.strokeOpacity);
100 p->setBrush(Qt::NoBrush);
101
103
104 p->setBrush(oldBrush);
105 }
106 p->setOpacity(oldOpacity);
107}
108
110{
111 QImage proxy = drawIntoBuffer(p, states, boundsRect);
112 if (proxy.isNull())
113 return;
115
116 p->save();
117 p->resetTransform();
118 p->drawImage(boundsRect, proxy);
119 p->restore();
120}
121
123{
126 qCWarning(lcSvgDraw) << "The requested buffer size is too big, ignoring";
127 return proxy;
128 }
129 proxy.setOffset(boundsRect.topLeft());
131 QPainter proxyPainter(&proxy);
132 proxyPainter.setPen(p->pen());
133 proxyPainter.setBrush(p->brush());
134 proxyPainter.setFont(p->font());
135 proxyPainter.translate(-boundsRect.topLeft());
136 proxyPainter.setTransform(p->transform(), true);
137 proxyPainter.setRenderHints(p->renderHints());
138 if (separateFillStroke())
139 fillThenStroke(&proxyPainter, states);
140 else
141 drawCommand(&proxyPainter, states);
142 return proxy;
143}
144
146{
147 QPainter proxyPainter(proxy);
148 proxyPainter.setCompositionMode(QPainter::CompositionMode_DestinationOut);
149 proxyPainter.resetTransform();
150 proxyPainter.drawImage(QRect(0, 0, mask.width(), mask.height()), mask);
151}
152
154{
155 QTransform xf = p->transform();
156 p->resetTransform();
157 p->drawImage(QRect(proxy.offset(), proxy.size()), proxy);
158 p->setTransform(xf);
159}
160
161bool QSvgNode::isDescendantOf(const QSvgNode *parent) const
162{
163 const QSvgNode *n = this;
164 while (n) {
165 if (n == parent)
166 return true;
167 n = n->m_parent;
168 }
169 return false;
170}
171
173{
174 //qDebug()<<"appending "<<prop->type()<< " ("<< id <<") "<<"to "<<this<<this->type();
175 QSvgTinyDocument *doc;
176 switch (prop->type()) {
178 m_style.quality = static_cast<QSvgQualityStyle*>(prop);
179 break;
181 m_style.fill = static_cast<QSvgFillStyle*>(prop);
182 break;
184 m_style.viewportFill = static_cast<QSvgViewportFillStyle*>(prop);
185 break;
187 m_style.font = static_cast<QSvgFontStyle*>(prop);
188 break;
190 m_style.stroke = static_cast<QSvgStrokeStyle*>(prop);
191 break;
193 m_style.solidColor = static_cast<QSvgSolidColorStyle*>(prop);
194 doc = document();
195 if (doc && !id.isEmpty())
197 break;
199 m_style.gradient = static_cast<QSvgGradientStyle*>(prop);
200 doc = document();
201 if (doc && !id.isEmpty())
203 break;
205 m_style.pattern = static_cast<QSvgPatternStyle*>(prop);
206 doc = document();
207 if (doc && !id.isEmpty())
208 doc->addNamedStyle(id, m_style.pattern);
209 break;
211 m_style.transform = static_cast<QSvgTransformStyle*>(prop);
212 break;
214 m_style.animateColor = static_cast<QSvgAnimateColor*>(prop);
215 break;
218 static_cast<QSvgAnimateTransform*>(prop));
219 break;
221 m_style.opacity = static_cast<QSvgOpacityStyle*>(prop);
222 break;
224 m_style.compop = static_cast<QSvgCompOpStyle*>(prop);
225 break;
226 default:
227 qDebug("QSvgNode: Trying to append unknown property!");
228 break;
229 }
230}
231
236
252
257
259{
260 const QSvgNode *node = this;
261 while (node) {
262 switch (type) {
264 if (node->m_style.quality)
265 return node->m_style.quality;
266 break;
268 if (node->m_style.fill)
269 return node->m_style.fill;
270 break;
273 return node->m_style.viewportFill;
274 break;
276 if (node->m_style.font)
277 return node->m_style.font;
278 break;
280 if (node->m_style.stroke)
281 return node->m_style.stroke;
282 break;
284 if (node->m_style.solidColor)
285 return node->m_style.solidColor;
286 break;
288 if (node->m_style.gradient)
289 return node->m_style.gradient;
290 break;
292 if (node->m_style.pattern)
293 return node->m_style.pattern;
294 break;
296 if (node->m_style.transform)
297 return node->m_style.transform;
298 break;
300 if (node->m_style.animateColor)
301 return node->m_style.animateColor;
302 break;
304 if (!node->m_style.animateTransforms.isEmpty())
305 return node->m_style.animateTransforms.first();
306 break;
308 if (node->m_style.opacity)
309 return node->m_style.opacity;
310 break;
312 if (node->m_style.compop)
313 return node->m_style.compop;
314 break;
315 default:
316 break;
317 }
318 node = node->parent();
319 }
320
321 return 0;
322}
323
325{
326 QString rid = id;
327 if (rid.startsWith(QLatin1Char('#')))
328 rid.remove(0, 1);
329 QSvgTinyDocument *doc = document();
330 return doc ? doc->namedStyle(rid) : 0;
331}
332
337
339{
340 return QRectF(0, 0, 0, 0);
341}
342
344{
345 if (!m_cachedBounds.isEmpty())
346 return m_cachedBounds;
347
348 QImage dummy(1, 1, QImage::Format_RGB32);
349 QPainter p(&dummy);
351
353 pen.setMiterLimit(4);
354 p.setPen(pen);
355
356 QStack<QSvgNode*> parentApplyStack;
357 QSvgNode *parent = m_parent;
358 while (parent) {
359 parentApplyStack.push(parent);
360 parent = parent->parent();
361 }
362
363 for (int i = parentApplyStack.size() - 1; i >= 0; --i)
364 parentApplyStack[i]->applyStyle(&p, states);
365
366 p.setWorldTransform(QTransform());
367
368 m_cachedBounds = transformedBounds(&p, states);
369 return m_cachedBounds;
370}
371
373{
374 QSvgTinyDocument *doc = nullptr;
375 QSvgNode *node = const_cast<QSvgNode*>(this);
376 while (node && node->type() != QSvgNode::Doc) {
377 node = node->parent();
378 }
379 doc = static_cast<QSvgTinyDocument*>(node);
380
381 return doc;
382}
383
385{
386 switch (type()) {
387 case Doc: return QStringLiteral("svg");
388 case Group: return QStringLiteral("g");
389 case Defs: return QStringLiteral("defs");
390 case Switch: return QStringLiteral("switch");
391 case Animation: return QStringLiteral("animation");
392 case Circle: return QStringLiteral("circle");
393 case Ellipse: return QStringLiteral("ellipse");
394 case Image: return QStringLiteral("image");
395 case Line: return QStringLiteral("line");
396 case Path: return QStringLiteral("path");
397 case Polygon: return QStringLiteral("polygon");
398 case Polyline: return QStringLiteral("polyline");
399 case Rect: return QStringLiteral("rect");
400 case Text: return QStringLiteral("text");
401 case Textarea: return QStringLiteral("textarea");
402 case Tspan: return QStringLiteral("tspan");
403 case Use: return QStringLiteral("use");
404 case Video: return QStringLiteral("video");
405 case Mask: return QStringLiteral("mask");
406 case Symbol: return QStringLiteral("symbol");
407 case Marker: return QStringLiteral("marker");
408 case Pattern: return QStringLiteral("pattern");
409 case Filter: return QStringLiteral("filter");
410 case FeMerge: return QStringLiteral("feMerge");
411 case FeMergenode: return QStringLiteral("feMergeNode");
412 case FeColormatrix: return QStringLiteral("feColorMatrix");
413 case FeGaussianblur: return QStringLiteral("feGaussianBlur");
414 case FeOffset: return QStringLiteral("feOffset");
415 case FeComposite: return QStringLiteral("feComposite");
416 case FeFlood: return QStringLiteral("feFlood");
417 case FeUnsupported: return QStringLiteral("feUnsupported");
418 }
419 return QStringLiteral("unknown");
420}
421
423{
424 m_requiredFeatures = lst;
425}
426
428{
429 return m_requiredFeatures;
430}
431
433{
434 m_requiredExtensions = lst;
435}
436
438{
439 return m_requiredExtensions;
440}
441
443{
444 m_requiredLanguages = lst;
445}
446
448{
449 return m_requiredLanguages;
450}
451
453{
454 m_requiredFormats = lst;
455}
456
458{
459 return m_requiredFormats;
460}
461
463{
464 m_requiredFonts = lst;
465}
466
468{
469 return m_requiredFonts;
470}
471
472void QSvgNode::setVisible(bool visible)
473{
474 //propagate visibility change of true to the parent
475 //not propagating false is just a small performance
476 //degradation since we'll iterate over children without
477 //drawing any of them
478 if (m_parent && visible && !m_parent->isVisible())
479 m_parent->setVisible(true);
480
481 m_visible = visible;
482}
483
491
493{
494 m_id = i;
495}
496
498{
499 m_class = str;
500}
501
503{
504 return m_maskId;
505}
506
508{
509 m_maskId = str;
510}
511
513{
515 return false;
516 return !m_maskId.isEmpty();
517}
518
520{
521 return m_filterId;
522}
523
525{
526 m_filterId = str;
527}
528
530{
532 return false;
533 return !m_filterId.isEmpty();
534}
535
537{
538 return m_markerStartId;
539}
540
542{
543 m_markerStartId = str;
544}
545
547{
549 return false;
550 return !m_markerStartId.isEmpty();
551}
552
554{
555 return m_markerMidId;
556}
557
559{
560 m_markerMidId = str;
561}
562
564{
566 return false;
567 return !m_markerMidId.isEmpty();
568}
569
571{
572 return m_markerEndId;
573}
574
576{
577 m_markerEndId = str;
578}
579
581{
583 return false;
584 return !m_markerEndId.isEmpty();
585}
586
588{
590 return false;
591 return hasMarkerStart() || hasMarkerMid() || hasMarkerEnd();
592}
593
595{
596 m_displayMode = mode;
597}
598
600{
601 return m_displayMode;
602}
603
605{
606 const QPen &pen = p->pen();
607 if (pen.style() == Qt::NoPen || pen.brush().style() == Qt::NoBrush || pen.isCosmetic())
608 return 0;
609 return pen.widthF();
610}
611
613{
615 pen.setMiterLimit(4);
616 p->setPen(pen);
617 p->setBrush(Qt::black);
618 p->setRenderHint(QPainter::Antialiasing);
619 p->setRenderHint(QPainter::SmoothPixmapTransform);
620 QFont font(p->font());
621 if (font.pointSize() < 0)
622 font.setPointSizeF(font.pixelSize() * 72.0 / p->device()->logicalDpiY());
623 p->setFont(font);
624}
625
627{
628 static bool alwaysDraw = qEnvironmentVariableIntValue("QT_SVG_DISABLE_SIZE_LIMIT");
629
630 if (m_displayMode == DisplayMode::NoneMode)
631 return false;
632
633 if (alwaysDraw)
634 return true;
635
636 QRectF brect = fastBounds(p, states);
637 if (brect.width() <= QT_SVG_SIZE_LIMIT && brect.height() <= QT_SVG_SIZE_LIMIT) {
638 return true;
639 } else {
640 qCWarning(lcSvgDraw) << "Shape of type" << type() << "ignored because it will take too long to rasterize (bounding rect=" << brect << ")."
641 << "Set QT_SVG_DISABLE_SIZE_LIMIT=1 to disable this check.";
642 return false;
643 }
644}
645
\inmodule QtGui
Definition qbrush.h:30
Qt::BrushStyle style() const
Returns the brush style.
Definition qbrush.h:120
\inmodule QtCore
void start() noexcept
\typealias QElapsedTimer::Duration Synonym for std::chrono::nanoseconds.
\reentrant
Definition qfont.h:22
int pixelSize() const
Returns the pixel size of the font if it was set with setPixelSize().
Definition qfont.cpp:1074
int pointSize() const
Returns the point size of the font.
Definition qfont.cpp:884
void setPointSizeF(qreal)
Sets the point size to pointSize.
Definition qfont.cpp:1010
static bool allocateImage(QSize size, QImage::Format format, QImage *image)
\inmodule QtGui
Definition qimage.h:37
@ Format_RGBA8888
Definition qimage.h:59
@ Format_RGB32
Definition qimage.h:46
bool isEmpty() const noexcept
Definition qlist.h:401
T & first()
Definition qlist.h:645
void append(parameter_type t)
Definition qlist.h:458
The QPainter class performs low-level painting on widgets and other paint devices.
Definition qpainter.h:46
@ SmoothPixmapTransform
Definition qpainter.h:54
@ Antialiasing
Definition qpainter.h:52
@ CompositionMode_DestinationOut
Definition qpainter.h:106
\inmodule QtGui
Definition qpen.h:28
qreal widthF() const
Returns the pen width with floating point precision.
Definition qpen.cpp:572
bool isCosmetic() const
Returns true if the pen is cosmetic; otherwise returns false.
Definition qpen.cpp:757
void setMiterLimit(qreal limit)
Sets the miter limit of this pen to the given limit.
Definition qpen.cpp:545
QBrush brush() const
Returns the brush used to fill strokes generated with this pen.
Definition qpen.cpp:715
Qt::PenStyle style() const
Returns the pen style.
Definition qpen.cpp:366
\inmodule QtCore\reentrant
Definition qrect.h:484
constexpr bool isEmpty() const noexcept
Returns true if the rectangle is empty, otherwise returns false.
Definition qrect.h:661
constexpr qreal height() const noexcept
Returns the height of the rectangle.
Definition qrect.h:732
constexpr qreal width() const noexcept
Returns the width of the rectangle.
Definition qrect.h:729
\inmodule QtCore\reentrant
Definition qrect.h:30
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
QString & remove(qsizetype i, qsizetype len)
Removes n characters from the string, starting at the given position index, and returns a reference t...
Definition qstring.cpp:3466
Type type() const override
QImage drawIntoBuffer(QPainter *p, QSvgExtraStates &states, const QRect &boundsRect)
Definition qsvgnode.cpp:122
void setMarkerMidId(const QString &str)
Definition qsvgnode.cpp:558
bool hasAnyMarker() const
Definition qsvgnode.cpp:587
void setRequiredFeatures(const QStringList &lst)
Definition qsvgnode.cpp:422
void setMaskId(const QString &str)
Definition qsvgnode.cpp:507
QString markerStartId() const
Definition qsvgnode.cpp:536
void setXmlClass(const QString &str)
Definition qsvgnode.cpp:497
void revertStyle(QPainter *p, QSvgExtraStates &states) const
Definition qsvgnode.cpp:253
void applyBufferToCanvas(QPainter *p, QImage proxy) const
Definition qsvgnode.cpp:153
bool hasMarkerMid() const
Definition qsvgnode.cpp:563
virtual bool separateFillStroke() const
Definition qsvgnode_p.h:92
QString typeName() const
Definition qsvgnode.cpp:384
static qreal strokeWidth(QPainter *p)
Definition qsvgnode.cpp:604
void applyMaskToBuffer(QImage *proxy, QImage mask) const
Definition qsvgnode.cpp:145
void setMarkerEndId(const QString &str)
Definition qsvgnode.cpp:575
QString markerMidId() const
Definition qsvgnode.cpp:553
bool hasMarkerEnd() const
Definition qsvgnode.cpp:580
bool isDescendantOf(const QSvgNode *parent) const
Definition qsvgnode.cpp:161
QString filterId() const
Definition qsvgnode.cpp:519
QSvgStyleProperty * styleProperty(QSvgStyleProperty::Type type) const
Definition qsvgnode.cpp:258
void setRequiredExtensions(const QStringList &lst)
Definition qsvgnode.cpp:432
bool hasFilter() const
Definition qsvgnode.cpp:529
void setMarkerStartId(const QString &str)
Definition qsvgnode.cpp:541
virtual QRectF bounds(QPainter *p, QSvgExtraStates &states) const
Definition qsvgnode.cpp:338
void setFilterId(const QString &str)
Definition qsvgnode.cpp:524
void setRequiredFonts(const QStringList &lst)
Definition qsvgnode.cpp:462
const QStringList & requiredLanguages() const
Definition qsvgnode.cpp:447
void setNodeId(const QString &i)
Definition qsvgnode.cpp:492
QSvgNode * parent() const
Definition qsvgnode_p.h:202
void applyStyle(QPainter *p, QSvgExtraStates &states) const
Definition qsvgnode.cpp:232
bool hasMarkerStart() const
Definition qsvgnode.cpp:546
QString maskId() const
Definition qsvgnode.cpp:502
const QStringList & requiredFonts() const
Definition qsvgnode.cpp:467
@ FeComposite
Definition qsvgnode_p.h:63
@ FeMergenode
Definition qsvgnode_p.h:59
@ FeUnsupported
Definition qsvgnode_p.h:65
@ FeGaussianblur
Definition qsvgnode_p.h:61
@ FeColormatrix
Definition qsvgnode_p.h:60
const QStringList & requiredFormats() const
Definition qsvgnode.cpp:457
void applyStyleRecursive(QPainter *p, QSvgExtraStates &states) const
Definition qsvgnode.cpp:246
DisplayMode displayMode() const
Definition qsvgnode.cpp:599
void appendStyleProperty(QSvgStyleProperty *prop, const QString &id)
Definition qsvgnode.cpp:172
QSvgStyle m_style
Definition qsvgnode_p.h:171
void fillThenStroke(QPainter *p, QSvgExtraStates &states)
Definition qsvgnode.cpp:85
void setDisplayMode(DisplayMode display)
Definition qsvgnode.cpp:594
virtual bool shouldDrawNode(QPainter *p, QSvgExtraStates &states) const
Definition qsvgnode.cpp:626
void draw(QPainter *p, QSvgExtraStates &states)
Definition qsvgnode.cpp:38
virtual ~QSvgNode()
Definition qsvgnode.cpp:33
QString markerEndId() const
Definition qsvgnode.cpp:570
virtual QRectF fastBounds(QPainter *p, QSvgExtraStates &states) const
Definition qsvgnode.cpp:333
QRectF transformedBounds() const
Definition qsvgnode.cpp:343
bool isVisible() const
Definition qsvgnode_p.h:207
QSvgNode(QSvgNode *parent=0)
Definition qsvgnode.cpp:26
static void initPainter(QPainter *p)
Definition qsvgnode.cpp:612
const QStringList & requiredFeatures() const
Definition qsvgnode.cpp:427
void setRequiredLanguages(const QStringList &lst)
Definition qsvgnode.cpp:442
QSvgTinyDocument * document() const
Definition qsvgnode.cpp:372
virtual Type type() const =0
bool hasMask() const
Definition qsvgnode.cpp:512
virtual void drawCommand(QPainter *p, QSvgExtraStates &states)=0
void setVisible(bool visible)
Definition qsvgnode.cpp:472
const QStringList & requiredExtensions() const
Definition qsvgnode.cpp:437
void setRequiredFormats(const QStringList &lst)
Definition qsvgnode.cpp:452
void drawWithMask(QPainter *p, QSvgExtraStates &states, const QImage &mask, const QRect &boundsRect)
Definition qsvgnode.cpp:109
virtual Type type() const =0
void apply(QPainter *p, const QSvgNode *node, QSvgExtraStates &states)
QSvgRefCounter< QSvgSolidColorStyle > solidColor
QSvgRefCounter< QSvgOpacityStyle > opacity
QSvgRefCounter< QSvgPatternStyle > pattern
QSvgRefCounter< QSvgViewportFillStyle > viewportFill
QList< QSvgRefCounter< QSvgAnimateTransform > > animateTransforms
QSvgRefCounter< QSvgFontStyle > font
QSvgRefCounter< QSvgTransformStyle > transform
QSvgRefCounter< QSvgStrokeStyle > stroke
QSvgRefCounter< QSvgAnimateColor > animateColor
QSvgRefCounter< QSvgQualityStyle > quality
QSvgRefCounter< QSvgFillStyle > fill
QSvgRefCounter< QSvgCompOpStyle > compop
QSvgRefCounter< QSvgGradientStyle > gradient
void revert(QPainter *p, QSvgExtraStates &states)
QSvgNode * namedNode(const QString &id) const
void addNamedStyle(const QString &id, QSvgPaintStyleProperty *style)
QSvgPaintStyleProperty * namedStyle(const QString &id) const
The QTransform class specifies 2D transformations of a coordinate system.
Definition qtransform.h:20
QString str
[2]
rect
[4]
Combined button and popup list for selecting options.
@ Tiny12FeaturesOnly
Definition qtsvgglobal.h:17
@ transparent
Definition qnamespace.h:47
@ black
Definition qnamespace.h:30
@ SolidLine
@ NoPen
@ SvgMiterJoin
@ NoBrush
@ FlatCap
#define Q_UNLIKELY(x)
#define qDebug
[1]
Definition qlogging.h:164
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
#define Q_DECLARE_LOGGING_CATEGORY(name)
GLenum mode
GLenum GLuint id
[7]
GLenum type
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
GLfloat n
GLfloat GLfloat p
[1]
GLuint * states
#define QStringLiteral(str)
#define QT_SVG_SIZE_LIMIT
Definition qsvgnode.cpp:23
Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept
double qreal
Definition qtypes.h:187
bool testFlag(MaskType mask, FlagType flag)
QNetworkProxy proxy
[0]
\inmodule QtCore \reentrant
Definition qchar.h:18