64void QColrPaintGraphRenderer::appendPath(
const QPainterPath &path)
66 qCDebug(lcColrv1).noquote().nospace()
67 << QByteArray().fill(
' ', m_oldPaths.size() * 2)
68 <<
"[append path: " << path.controlPointRect()
71 QPainterPath transformedPath(m_currentTransform.map(path));
72 m_currentPath = m_currentPath.united(transformedPath);
74 m_boundingRect = m_boundingRect.united(transformedPath.boundingRect());
98void QColrPaintGraphRenderer::setLinearGradient(QPointF p0, QPointF p1, QPointF p2,
99 QGradient::Spread spread,
100 const QGradientStops &gradientStops)
102 if (m_painter !=
nullptr) {
103 qCDebug(lcColrv1).noquote().nospace()
104 << QByteArray().fill(
' ', m_oldPaths.size() * 2)
105 <<
"[linear gradient " << p0 <<
", " << p1 <<
", " << p2
106 <<
", spread: " << spread
107 <<
", stop count: " << gradientStops.size()
114 QVector2D p0p2(p2 - p0);
115 if (qFuzzyIsNull(p0p2.lengthSquared())) {
116 qCWarning(lcColrv1) <<
"Malformed linear gradient in COLRv1 graph. Points:"
124 QVector2D v(p0p2.y(), -p0p2.x());
127 QVector2D u(p1 - p0);
128 if (qFuzzyIsNull(u.lengthSquared())) {
129 qCWarning(lcColrv1) <<
"Malformed linear gradient in COLRv1 graph. Points:"
137 QPointF p3((QVector2D(p0) + v * QVector2D::dotProduct(u, v) / v.lengthSquared()).toPointF());
139 p0 = m_currentTransform.map(p0);
140 p3 = m_currentTransform.map(p1);
142 QLinearGradient linearGradient(p0, p3);
143 linearGradient.setSpread(spread);
144 linearGradient.setStops(gradientStops);
145 linearGradient.setCoordinateMode(QGradient::LogicalMode);
147 m_painter->setBrush(linearGradient);
151void QColrPaintGraphRenderer::setConicalGradient(QPointF center,
152 qreal startAngle, qreal endAngle,
153 QGradient::Spread spread,
154 const QGradientStops &gradientStops)
156 if (m_painter !=
nullptr) {
157 qCDebug(lcColrv1).noquote().nospace()
158 << QByteArray().fill(
' ', m_oldPaths.size() * 2)
159 <<
"[conical gradient " << center
160 <<
", startAngle=" << startAngle
161 <<
", endAngle=" << endAngle
162 <<
", spread: " << spread
163 <<
", stop count: " << gradientStops.size()
166 QConicalGradient conicalGradient(center, startAngle);
167 conicalGradient.setSpread(spread);
175 const qreal multiplier = qFuzzyCompare(endAngle, startAngle)
177 : (endAngle - startAngle) / 360.0;
179 QGradientStops adaptedStops;
180 adaptedStops.reserve(gradientStops.size());
182 for (
const QGradientStop &gradientStop : gradientStops)
183 adaptedStops.append(qMakePair(gradientStop.first * multiplier, gradientStop.second));
185 conicalGradient.setStops(adaptedStops);
186 conicalGradient.setCoordinateMode(QGradient::LogicalMode);
188 m_painter->setBrush(conicalGradient);
192void QColrPaintGraphRenderer::setRadialGradient(QPointF c0, qreal r0,
193 QPointF c1, qreal r1,
194 QGradient::Spread spread,
195 const QGradientStops &gradientStops)
197 if (m_painter !=
nullptr) {
198 qCDebug(lcColrv1).noquote().nospace()
199 << QByteArray().fill(
' ', m_oldPaths.size() * 2)
200 <<
"[radial gradient " << c0
204 <<
", spread: " << spread
205 <<
", stop count: " << gradientStops.size()
208 QPointF c0e(c0 + QPointF(r0, 0.0));
209 QPointF c1e(c1 + QPointF(r1, 0.0));
211 c0 = m_currentTransform.map(c0);
212 c0e = m_currentTransform.map(c0e);
213 c1 = m_currentTransform.map(c1);
214 c1e = m_currentTransform.map(c1e);
216 const QVector2D d0(c0e - c0);
217 const QVector2D d1(c1e - c1);
219 QRadialGradient gradient(c1, d1.length(), c0, d0.length());
220 gradient.setCoordinateMode(QGradient::LogicalMode);
221 gradient.setSpread(spread);
222 gradient.setStops(gradientStops);
223 m_painter->setBrush(gradient);
248void QColrPaintGraphRenderer::drawImage(
const QImage &image)
250 qCDebug(lcColrv1).noquote().nospace()
251 << QByteArray().fill(
' ', m_oldPaths.size() * 2)
252 <<
"[draw image: " << image.size() <<
"]";
254 if (m_painter !=
nullptr) {
255 m_painter->setWorldMatrixEnabled(
false);
256 m_painter->drawImage(QPoint(0, 0), image);
257 m_painter->setWorldMatrixEnabled(
true);
271void QColrPaintGraphRenderer::beginRender(qreal pixelSizeScale,
const QTransform &transform)
273 qCDebug(lcColrv1).noquote().nospace()
274 << QByteArray().fill(
' ', m_oldPaths.size() * 2)
275 <<
"[begin render scale: " << pixelSizeScale
276 <<
", transform: " << transform
279 if (m_boundingRect.isEmpty())
282 QRect alignedRect(m_boundingRect.toAlignedRect());
284 m_image = QImage(alignedRect.size(), QImage::Format_ARGB32_Premultiplied);
285 m_image.fill(Qt::transparent);
287 Q_ASSERT(m_painter ==
nullptr);
288 m_painter =
new QPainter;
289 m_painter->begin(&m_image);
290 m_painter->setRenderHint(QPainter::Antialiasing);
291 m_painter->setPen(Qt::NoPen);
292 m_painter->setBrush(Qt::NoBrush);
294 m_painter->translate(-alignedRect.topLeft());
297 m_painter->scale(pixelSizeScale, pixelSizeScale);
298 m_painter->setWorldTransform(transform,
true);