From 83ecb25998aa41ae4f8dc48dd6a96cfe7e87a67f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Wed, 13 Apr 2011 10:16:43 +0200 Subject: [PATCH] Added support for six-parameter radial gradients. The extended radial gradients conform to the radial gradient specification in HTML 5 canvas. Task-number: QTBUG-14075 Reviewed-by: Andreas Kling (cherry picked from commit da55c1ea92474e989e5582b02815936bbf584405) --- src/gui/painting/qbrush.cpp | 191 ++++++++++++++++-- src/gui/painting/qbrush.h | 12 +- src/gui/painting/qdrawhelper.cpp | 42 +++- src/gui/painting/qdrawhelper_neon.cpp | 2 + src/gui/painting/qdrawhelper_p.h | 102 ++++++---- src/gui/painting/qdrawhelper_sse2.cpp | 2 + src/gui/painting/qpaintengine_mac.cpp | 3 +- src/gui/painting/qpaintengine_raster.cpp | 3 +- src/gui/painting/qpaintengineex.cpp | 46 +++++ src/gui/painting/qpainter.cpp | 14 +- src/gui/painting/qpainter.h | 1 + .../qglengineshadermanager.cpp | 2 + .../qglengineshadermanager_p.h | 2 + .../qglengineshadersource_p.h | 18 +- .../qpaintengineex_opengl2.cpp | 8 +- src/opengl/qpaintengine_opengl.cpp | 60 +----- src/openvg/qpaintengine_vg.cpp | 111 ++++++++++ tests/arthur/common/paintcommands.cpp | 34 +++- tests/arthur/common/paintcommands.h | 1 + .../data/qps/radial_gradients_extended.qps | 95 +++++++++ .../qps/radial_gradients_extended_qps.png | Bin 0 -> 107978 bytes 21 files changed, 618 insertions(+), 131 deletions(-) create mode 100644 tests/arthur/data/qps/radial_gradients_extended.qps create mode 100644 tests/arthur/data/qps/radial_gradients_extended_qps.png diff --git a/src/gui/painting/qbrush.cpp b/src/gui/painting/qbrush.cpp index bf5764a609..3ff7eb84d0 100644 --- a/src/gui/painting/qbrush.cpp +++ b/src/gui/painting/qbrush.cpp @@ -840,6 +840,22 @@ const QGradient *QBrush::gradient() const return 0; } +Q_GUI_EXPORT bool qt_isExtendedRadialGradient(const QBrush &brush) +{ + if (brush.style() == Qt::RadialGradientPattern) { + const QGradient *g = brush.gradient(); + const QRadialGradient *rg = static_cast(g); + + if (!qFuzzyIsNull(rg->focalRadius())) + return true; + + QPointF delta = rg->focalPoint() - rg->center(); + if (delta.x() * delta.x() + delta.y() * delta.y() > rg->radius() * rg->radius()) + return true; + } + + return false; +} /*! Returns true if the brush is fully opaque otherwise false. A brush @@ -849,6 +865,7 @@ const QGradient *QBrush::gradient() const \i The alpha component of the color() is 255. \i Its texture() does not have an alpha channel and is not a QBitmap. \i The colors in the gradient() all have an alpha component that is 255. + \i It is an extended radial gradient. \endlist */ @@ -860,6 +877,9 @@ bool QBrush::isOpaque() const if (d->style == Qt::SolidPattern) return opaqueColor; + if (qt_isExtendedRadialGradient(*this)) + return false; + if (d->style == Qt::LinearGradientPattern || d->style == Qt::RadialGradientPattern || d->style == Qt::ConicalGradientPattern) { @@ -1209,8 +1229,10 @@ QDataStream &operator>>(QDataStream &s, QBrush &b) \list \o \e Linear gradients interpolate colors between start and end points. - \o \e Radial gradients interpolate colors between a focal point and end - points on a circle surrounding it. + \o \e Simple radial gradients interpolate colors between a focal point + and end points on a circle surrounding it. + \o \e Extended radial gradients interpolate colors between a center and + a focal circle. \o \e Conical gradients interpolate colors around a center point. \endlist @@ -1506,8 +1528,6 @@ void QGradient::setInterpolationMode(InterpolationMode mode) dummy = p; } -#undef Q_DUMMY_ACCESSOR - /*! \fn bool QGradient::operator!=(const QGradient &gradient) const \since 4.2 @@ -1541,7 +1561,7 @@ bool QGradient::operator==(const QGradient &gradient) const || m_data.radial.cy != gradient.m_data.radial.cy || m_data.radial.fx != gradient.m_data.radial.fx || m_data.radial.fy != gradient.m_data.radial.fy - || m_data.radial.radius != gradient.m_data.radial.radius) + || m_data.radial.cradius != gradient.m_data.radial.cradius) return false; } else { // m_type == ConicalGradient if (m_data.conical.cx != gradient.m_data.conical.cx @@ -1747,10 +1767,17 @@ void QLinearGradient::setFinalStop(const QPointF &stop) \brief The QRadialGradient class is used in combination with QBrush to specify a radial gradient brush. - Radial gradients interpolate colors between a focal point and end - points on a circle surrounding it. Outside the end points the - gradient is either padded, reflected or repeated depending on the - currently set \l {QGradient::Spread}{spread} method: + Qt supports both simple and extended radial gradients. + + Simple radial gradients interpolate colors between a focal point and end + points on a circle surrounding it. Extended radial gradients interpolate + colors between a focal circle and a center circle. Points outside the cone + defined by the two circles will be transparent. For simple radial gradients + the focal point is adjusted to lie inside the center circle, whereas the + focal point can have any position in an extended radial gradient. + + Outside the end points the gradient is either padded, reflected or repeated + depending on the currently set \l {QGradient::Spread}{spread} method: \table \row @@ -1795,9 +1822,14 @@ static QPointF qt_radial_gradient_adapt_focal_point(const QPointF ¢er, } /*! - Constructs a radial gradient with the given \a center, \a + Constructs a simple radial gradient with the given \a center, \a radius and \a focalPoint. + \note If the given focal point is outside the circle defined by the + center (\a cx, \a cy) and the \a radius it will be re-adjusted to + the intersection between the line from the center to the focal point + and the circle. + \sa QGradient::setColorAt(), QGradient::setStops() */ @@ -1807,7 +1839,7 @@ QRadialGradient::QRadialGradient(const QPointF ¢er, qreal radius, const QPoi m_spread = PadSpread; m_data.radial.cx = center.x(); m_data.radial.cy = center.y(); - m_data.radial.radius = radius; + m_data.radial.cradius = radius; QPointF adapted_focal = qt_radial_gradient_adapt_focal_point(center, radius, focalPoint); m_data.radial.fx = adapted_focal.x(); @@ -1815,7 +1847,7 @@ QRadialGradient::QRadialGradient(const QPointF ¢er, qreal radius, const QPoi } /*! - Constructs a radial gradient with the given \a center, \a + Constructs a simple radial gradient with the given \a center, \a radius and the focal point in the circle center. \sa QGradient::setColorAt(), QGradient::setStops() @@ -1826,16 +1858,21 @@ QRadialGradient::QRadialGradient(const QPointF ¢er, qreal radius) m_spread = PadSpread; m_data.radial.cx = center.x(); m_data.radial.cy = center.y(); - m_data.radial.radius = radius; + m_data.radial.cradius = radius; m_data.radial.fx = center.x(); m_data.radial.fy = center.y(); } /*! - Constructs a radial gradient with the given center (\a cx, \a cy), + Constructs a simple radial gradient with the given center (\a cx, \a cy), \a radius and focal point (\a fx, \a fy). + \note If the given focal point is outside the circle defined by the + center (\a cx, \a cy) and the \a radius it will be re-adjusted to + the intersection between the line from the center to the focal point + and the circle. + \sa QGradient::setColorAt(), QGradient::setStops() */ @@ -1845,7 +1882,7 @@ QRadialGradient::QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qre m_spread = PadSpread; m_data.radial.cx = cx; m_data.radial.cy = cy; - m_data.radial.radius = radius; + m_data.radial.cradius = radius; QPointF adapted_focal = qt_radial_gradient_adapt_focal_point(QPointF(cx, cy), radius, @@ -1856,7 +1893,7 @@ QRadialGradient::QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qre } /*! - Constructs a radial gradient with the center at (\a cx, \a cy) and the + Constructs a simple radial gradient with the center at (\a cx, \a cy) and the specified \a radius. The focal point lies at the center of the circle. \sa QGradient::setColorAt(), QGradient::setStops() @@ -1867,14 +1904,14 @@ QRadialGradient::QRadialGradient(qreal cx, qreal cy, qreal radius) m_spread = PadSpread; m_data.radial.cx = cx; m_data.radial.cy = cy; - m_data.radial.radius = radius; + m_data.radial.cradius = radius; m_data.radial.fx = cx; m_data.radial.fy = cy; } /*! - Constructs a radial gradient with the center and focal point at + Constructs a simple radial gradient with the center and focal point at (0, 0) with a radius of 1. */ QRadialGradient::QRadialGradient() @@ -1883,11 +1920,51 @@ QRadialGradient::QRadialGradient() m_spread = PadSpread; m_data.radial.cx = 0; m_data.radial.cy = 0; - m_data.radial.radius = 1; + m_data.radial.cradius = 1; m_data.radial.fx = 0; m_data.radial.fy = 0; } +/*! + \since 4.8 + + Constructs an extended radial gradient with the given \a center, \a + centerRadius, \a focalPoint, and \a focalRadius. +*/ +QRadialGradient::QRadialGradient(const QPointF ¢er, qreal centerRadius, const QPointF &focalPoint, qreal focalRadius) +{ + m_type = RadialGradient; + m_spread = PadSpread; + m_data.radial.cx = center.x(); + m_data.radial.cy = center.y(); + m_data.radial.cradius = centerRadius; + + m_data.radial.fx = focalPoint.x(); + m_data.radial.fy = focalPoint.y(); + setFocalRadius(focalRadius); +} + +/*! + \since 4.8 + + Constructs an extended radial gradient with the given \a center, \a + centerRadius, \a focalPoint, and \a focalRadius. + Constructs a radial gradient with the given center (\a cx, \a cy), + center radius \a centerRadius, focal point (\a fx, \a fy), and + focal radius \a focalRadius. +*/ +QRadialGradient::QRadialGradient(qreal cx, qreal cy, qreal centerRadius, qreal fx, qreal fy, qreal focalRadius) +{ + m_type = RadialGradient; + m_spread = PadSpread; + m_data.radial.cx = cx; + m_data.radial.cy = cy; + m_data.radial.cradius = centerRadius; + + m_data.radial.fx = fx; + m_data.radial.fy = fy; + setFocalRadius(focalRadius); +} /*! Returns the center of this radial gradient in logical coordinates. @@ -1932,13 +2009,15 @@ void QRadialGradient::setCenter(const QPointF ¢er) /*! Returns the radius of this radial gradient in logical coordinates. + Equivalent to centerRadius() + \sa QGradient::stops() */ qreal QRadialGradient::radius() const { Q_ASSERT(m_type == RadialGradient); - return m_data.radial.radius; + return m_data.radial.cradius; } @@ -1947,13 +2026,81 @@ qreal QRadialGradient::radius() const Sets the radius of this radial gradient in logical coordinates to \a radius + + Equivalent to setCenterRadius() */ void QRadialGradient::setRadius(qreal radius) { Q_ASSERT(m_type == RadialGradient); - m_data.radial.radius = radius; + m_data.radial.cradius = radius; } +/*! + \since 4.8 + + Returns the center radius of this radial gradient in logical + coordinates. + + \sa QGradient::stops() +*/ +qreal QRadialGradient::centerRadius() const +{ + Q_ASSERT(m_type == RadialGradient); + return m_data.radial.cradius; +} + +/* + \since 4.8 + + Sets the center radius of this radial gradient in logical coordinates + to \a radius +*/ +void QRadialGradient::setCenterRadius(qreal radius) +{ + Q_ASSERT(m_type == RadialGradient); + m_data.radial.cradius = radius; +} + +/*! + \since 4.8 + + Returns the focal radius of this radial gradient in logical + coordinates. + + \sa QGradient::stops() +*/ +qreal QRadialGradient::focalRadius() const +{ + Q_ASSERT(m_type == RadialGradient); + Q_DUMMY_ACCESSOR + + // mask away low three bits + union { float f; quint32 i; } u; + u.i = i & ~0x07; + return u.f; +} + +/* + \since 4.8 + + Sets the focal radius of this radial gradient in logical coordinates + to \a radius +*/ +void QRadialGradient::setFocalRadius(qreal radius) +{ + Q_ASSERT(m_type == RadialGradient); + Q_DUMMY_ACCESSOR + + // Since there's no QGradientData, we only have the dummy void * to + // store additional data in. The three lowest bits are already + // taken, thus we cut the three lowest bits from the significand + // and store the radius as a float. + union { float f; quint32 i; } u; + u.f = float(radius); + // add 0x04 to round up when we drop the three lowest bits + i |= (u.i + 0x04) & ~0x07; + dummy = p; +} /*! Returns the focal point of this radial gradient in logical @@ -2193,4 +2340,6 @@ void QConicalGradient::setAngle(qreal angle) \sa setTransform() */ +#undef Q_DUMMY_ACCESSOR + QT_END_NAMESPACE diff --git a/src/gui/painting/qbrush.h b/src/gui/painting/qbrush.h index 8b313196db..d914c8c5b1 100644 --- a/src/gui/painting/qbrush.h +++ b/src/gui/painting/qbrush.h @@ -255,6 +255,7 @@ private: friend class QLinearGradient; friend class QRadialGradient; friend class QConicalGradient; + friend class QBrush; Type m_type; Spread m_spread; @@ -264,7 +265,7 @@ private: qreal x1, y1, x2, y2; } linear; struct { - qreal cx, cy, fx, fy, radius; + qreal cx, cy, fx, fy, cradius; } radial; struct { qreal cx, cy, angle; @@ -303,6 +304,9 @@ public: QRadialGradient(const QPointF ¢er, qreal radius); QRadialGradient(qreal cx, qreal cy, qreal radius); + QRadialGradient(const QPointF ¢er, qreal centerRadius, const QPointF &focalPoint, qreal focalRadius); + QRadialGradient(qreal cx, qreal cy, qreal centerRadius, qreal fx, qreal fy, qreal focalRadius); + QPointF center() const; void setCenter(const QPointF ¢er); inline void setCenter(qreal x, qreal y) { setCenter(QPointF(x, y)); } @@ -313,6 +317,12 @@ public: qreal radius() const; void setRadius(qreal radius); + + qreal centerRadius() const; + void setCenterRadius(qreal radius); + + qreal focalRadius() const; + void setFocalRadius(qreal radius); }; diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 09610ed795..360292c4d7 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -1406,23 +1406,47 @@ static void QT_FASTCALL getRadialGradientValues(RadialGradientValues *v, const Q { v->dx = data->gradient.radial.center.x - data->gradient.radial.focal.x; v->dy = data->gradient.radial.center.y - data->gradient.radial.focal.y; - v->a = data->gradient.radial.radius*data->gradient.radial.radius - v->dx*v->dx - v->dy*v->dy; + + v->dr = data->gradient.radial.center.radius - data->gradient.radial.focal.radius; + v->sqrfr = data->gradient.radial.focal.radius * data->gradient.radial.focal.radius; + + v->a = v->dr * v->dr - v->dx*v->dx - v->dy*v->dy; + v->inv2a = 1 / (2 * v->a); + + v->extended = !qFuzzyIsNull(data->gradient.radial.focal.radius) || v->a <= 0; } class RadialFetchPlain { public: - static inline void fetch(uint *buffer, uint *end, const QSpanData *data, qreal det, qreal delta_det, - qreal delta_delta_det, qreal b, qreal delta_b) + static inline void fetch(uint *buffer, uint *end, const Operator *op, const QSpanData *data, qreal det, + qreal delta_det, qreal delta_delta_det, qreal b, qreal delta_b) { - while (buffer < end) { - *buffer = qt_gradient_pixel(&data->gradient, (det > 0 ? qSqrt(det) : 0) - b); + if (op->radial.extended) { + while (buffer < end) { + quint32 result = 0; + if (det >= 0) { + qreal w = qSqrt(det) - b; + if (data->gradient.radial.focal.radius + op->radial.dr * w >= 0) + result = qt_gradient_pixel(&data->gradient, w); + } - det += delta_det; - delta_det += delta_delta_det; - b += delta_b; + *buffer = result; - ++buffer; + det += delta_det; + delta_det += delta_delta_det; + b += delta_b; + + ++buffer; + } + } else { + while (buffer < end) { + *buffer++ = qt_gradient_pixel(&data->gradient, qSqrt(det) - b); + + det += delta_det; + delta_det += delta_delta_det; + b += delta_b; + } } } }; diff --git a/src/gui/painting/qdrawhelper_neon.cpp b/src/gui/painting/qdrawhelper_neon.cpp index 7eb2f09d7a..e673dd9861 100644 --- a/src/gui/painting/qdrawhelper_neon.cpp +++ b/src/gui/painting/qdrawhelper_neon.cpp @@ -985,6 +985,8 @@ public: static inline Float32x4 v_sqrt(Float32x4 x) { Float32x4 y = vrsqrteq_f32(x); y = vmulq_f32(y, vrsqrtsq_f32(x, vmulq_f32(y, y))); return vmulq_f32(x, y); } static inline Int32x4 v_toInt(Float32x4 x) { return vcvtq_s32_f32(x); } + + static inline Int32x4 v_greaterOrEqual(Float32x4 a, Float32x4 b) { return vcge_f32(a, b); } }; const uint * QT_FASTCALL qt_fetch_radial_gradient_neon(uint *buffer, const Operator *op, const QSpanData *data, diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h index a92f68613d..e93d7361e3 100644 --- a/src/gui/painting/qdrawhelper_p.h +++ b/src/gui/painting/qdrawhelper_p.h @@ -191,7 +191,11 @@ struct RadialGradientValues { qreal dx; qreal dy; + qreal dr; + qreal sqrfr; qreal a; + qreal inv2a; + bool extended; }; struct Operator; @@ -239,12 +243,13 @@ struct QRadialGradientData struct { qreal x; qreal y; + qreal radius; } center; struct { qreal x; qreal y; + qreal radius; } focal; - qreal radius; }; struct QConicalGradientData @@ -381,12 +386,6 @@ static inline qreal qRadialDeterminant(qreal a, qreal b, qreal c) return (b * b) - (4 * a * c); } -// function to evaluate real roots -static inline qreal qRadialRealRoots(qreal a, qreal b, qreal detSqrt) -{ - return (-b + detSqrt)/(2 * a); -} - template const uint * QT_FASTCALL qt_fetch_radial_gradient_template(uint *buffer, const Operator *op, const QSpanData *data, int y, int x, int length) @@ -394,7 +393,7 @@ const uint * QT_FASTCALL qt_fetch_radial_gradient_template(uint *buffer, const O // avoid division by zero if (qFuzzyIsNull(op->radial.a)) { extern void (*qt_memfill32)(quint32 *dest, quint32 value, int count); - qt_memfill32(buffer, data->gradient.colorTable[0], length); + qt_memfill32(buffer, 0, length); return buffer; } @@ -415,7 +414,7 @@ const uint * QT_FASTCALL qt_fetch_radial_gradient_template(uint *buffer, const O const qreal delta_rx = data->m11; const qreal delta_ry = data->m12; - qreal b = 2*(rx * op->radial.dx + ry * op->radial.dy); + qreal b = 2*(op->radial.dr*data->gradient.radial.focal.radius + rx * op->radial.dx + ry * op->radial.dy); qreal delta_b = 2*(delta_rx * op->radial.dx + delta_ry * op->radial.dy); const qreal b_delta_b = 2 * b * delta_b; const qreal delta_b_delta_b = 2 * delta_b * delta_b; @@ -433,31 +432,45 @@ const uint * QT_FASTCALL qt_fetch_radial_gradient_template(uint *buffer, const O inv_a *= inv_a; - qreal det = (bb + 4 * op->radial.a * rxrxryry) * inv_a; + qreal det = (bb - 4 * op->radial.a * (op->radial.sqrfr - rxrxryry)) * inv_a; qreal delta_det = (b_delta_b + delta_bb + 4 * op->radial.a * (rx_plus_ry + delta_rxrxryry)) * inv_a; const qreal delta_delta_det = (delta_b_delta_b + 4 * op->radial.a * delta_rx_plus_ry) * inv_a; - RadialFetchFunc::fetch(buffer, end, data, det, delta_det, delta_delta_det, b, delta_b); + RadialFetchFunc::fetch(buffer, end, op, data, det, delta_det, delta_delta_det, b, delta_b); } else { qreal rw = data->m23 * (y + qreal(0.5)) + data->m33 + data->m13 * (x + qreal(0.5)); - if (!rw) - rw = 1; - while (buffer < end) { - qreal gx = rx/rw - data->gradient.radial.focal.x; - qreal gy = ry/rw - data->gradient.radial.focal.y; - qreal b = 2*(gx*op->radial.dx + gy*op->radial.dy); - qreal det = qRadialDeterminant(op->radial.a, b , -(gx*gx + gy*gy)); - qreal s = qRadialRealRoots(op->radial.a, b, (det > 0 ? qSqrt(det) : 0)); - *buffer = qt_gradient_pixel(&data->gradient, s); + while (buffer < end) { + if (rw == 0) { + *buffer = 0; + } else { + qreal invRw = 1 / rw; + qreal gx = rx * invRw - data->gradient.radial.focal.x; + qreal gy = ry * invRw - data->gradient.radial.focal.y; + qreal b = 2*(op->radial.dr*data->gradient.radial.focal.radius + gx*op->radial.dx + gy*op->radial.dy); + qreal det = qRadialDeterminant(op->radial.a, b, op->radial.sqrfr - (gx*gx + gy*gy)); + + quint32 result = 0; + if (det >= 0) { + qreal detSqrt = qSqrt(det); + + qreal s0 = (-b - detSqrt) * op->radial.inv2a; + qreal s1 = (-b + detSqrt) * op->radial.inv2a; + + qreal s = qMax(s0, s1); + + if (data->gradient.radial.focal.radius + op->radial.dr * s >= 0) + result = qt_gradient_pixel(&data->gradient, s); + } + + *buffer = result; + } rx += data->m11; ry += data->m12; rw += data->m13; - if (!rw) { - rw += data->m13; - } + ++buffer; } } @@ -469,8 +482,8 @@ template class QRadialFetchSimd { public: - static inline void fetch(uint *buffer, uint *end, const QSpanData *data, qreal det, qreal delta_det, - qreal delta_delta_det, qreal b, qreal delta_b) + static void fetch(uint *buffer, uint *end, const Operator *op, const QSpanData *data, qreal det, + qreal delta_det, qreal delta_delta_det, qreal b, qreal delta_b) { typename Simd::Vect_buffer_f det_vec; typename Simd::Vect_buffer_f delta_det4_vec; @@ -490,6 +503,9 @@ public: const typename Simd::Float32x4 v_delta_delta_det6 = Simd::v_dup(6 * delta_delta_det); const typename Simd::Float32x4 v_delta_b4 = Simd::v_dup(4 * delta_b); + const typename Simd::Float32x4 v_r0 = Simd::v_dup(data->gradient.radial.focal.radius); + const typename Simd::Float32x4 v_dr = Simd::v_dup(op->radial.dr); + const typename Simd::Float32x4 v_min = Simd::v_dup(0.0f); const typename Simd::Float32x4 v_max = Simd::v_dup(GRADIENT_STOPTABLE_SIZE-1.5f); const typename Simd::Float32x4 v_half = Simd::v_dup(0.5f); @@ -501,10 +517,15 @@ public: const typename Simd::Int32x4 v_reflect_limit = Simd::v_dup(2 * GRADIENT_STOPTABLE_SIZE - 1); + const int extended_mask = op->radial.extended ? 0x0 : ~0x0; + #define FETCH_RADIAL_LOOP_PROLOGUE \ while (buffer < end) { \ + typename Simd::Vect_buffer_i v_buffer_mask; \ + v_buffer_mask.v = Simd::v_greaterOrEqual(det_vec.v, v_min); \ const typename Simd::Float32x4 v_index_local = Simd::v_sub(Simd::v_sqrt(Simd::v_max(v_min, det_vec.v)), b_vec.v); \ const typename Simd::Float32x4 v_index = Simd::v_add(Simd::v_mul(v_index_local, v_table_size_minus_one), v_half); \ + v_buffer_mask.v = Simd::v_and(v_buffer_mask.v, Simd::v_greaterOrEqual(Simd::v_add(v_r0, Simd::v_mul(v_dr, v_index_local)), v_min)); \ typename Simd::Vect_buffer_i index_vec; #define FETCH_RADIAL_LOOP_CLAMP_REPEAT \ index_vec.v = Simd::v_and(v_repeat_mask, Simd::v_toInt(v_index)); @@ -519,21 +540,26 @@ public: delta_det4_vec.v = Simd::v_add(delta_det4_vec.v, v_delta_delta_det16); \ b_vec.v = Simd::v_add(b_vec.v, v_delta_b4); \ for (int i = 0; i < 4; ++i) \ - *buffer++ = data->gradient.colorTable[index_vec.i[i]]; \ + *buffer++ = (extended_mask | v_buffer_mask.i[i]) & data->gradient.colorTable[index_vec.i[i]]; \ } - if (data->gradient.spread == QGradient::RepeatSpread) { - FETCH_RADIAL_LOOP_PROLOGUE - FETCH_RADIAL_LOOP_CLAMP_REPEAT - FETCH_RADIAL_LOOP_EPILOGUE - } else if (data->gradient.spread == QGradient::ReflectSpread) { - FETCH_RADIAL_LOOP_PROLOGUE - FETCH_RADIAL_LOOP_CLAMP_REFLECT - FETCH_RADIAL_LOOP_EPILOGUE - } else { - FETCH_RADIAL_LOOP_PROLOGUE - FETCH_RADIAL_LOOP_CLAMP_PAD - FETCH_RADIAL_LOOP_EPILOGUE +#define FETCH_RADIAL_LOOP(FETCH_RADIAL_LOOP_CLAMP) \ + FETCH_RADIAL_LOOP_PROLOGUE \ + FETCH_RADIAL_LOOP_CLAMP \ + FETCH_RADIAL_LOOP_EPILOGUE + + switch (data->gradient.spread) { + case QGradient::RepeatSpread: + FETCH_RADIAL_LOOP(FETCH_RADIAL_LOOP_CLAMP_REPEAT) + break; + case QGradient::ReflectSpread: + FETCH_RADIAL_LOOP(FETCH_RADIAL_LOOP_CLAMP_REFLECT) + break; + case QGradient::PadSpread: + FETCH_RADIAL_LOOP(FETCH_RADIAL_LOOP_CLAMP_PAD) + break; + default: + Q_ASSERT(false); } } }; diff --git a/src/gui/painting/qdrawhelper_sse2.cpp b/src/gui/painting/qdrawhelper_sse2.cpp index 542d845dde..fdab95fdda 100644 --- a/src/gui/painting/qdrawhelper_sse2.cpp +++ b/src/gui/painting/qdrawhelper_sse2.cpp @@ -522,6 +522,8 @@ public: static inline Float32x4 v_sqrt(Float32x4 x) { return _mm_sqrt_ps(x); } static inline Int32x4 v_toInt(Float32x4 x) { return _mm_cvttps_epi32(x); } + + static inline Int32x4 v_greaterOrEqual(Float32x4 a, Float32x4 b) { return (__m128i)_mm_cmpgt_ps(a, b); } }; const uint * QT_FASTCALL qt_fetch_radial_gradient_sse2(uint *buffer, const Operator *op, const QSpanData *data, diff --git a/src/gui/painting/qpaintengine_mac.cpp b/src/gui/painting/qpaintengine_mac.cpp index c6d061dea8..6dcc3cc9fc 100644 --- a/src/gui/painting/qpaintengine_mac.cpp +++ b/src/gui/painting/qpaintengine_mac.cpp @@ -1546,8 +1546,9 @@ void QCoreGraphicsPaintEnginePrivate::setFillBrush(const QPointF &offset) QPointF center(radialGrad->center()); QPointF focal(radialGrad->focalPoint()); qreal radius = radialGrad->radius(); + qreal focalRadius = radialGrad->focalRadius(); shading = CGShadingCreateRadial(colorspace, CGPointMake(focal.x(), focal.y()), - 0.0, CGPointMake(center.x(), center.y()), radius, fill_func, false, true); + focalRadius, CGPointMake(center.x(), center.y()), radius, fill_func, false, true); } CGFunctionRelease(fill_func); diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 8486adb64a..2119e307d7 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -5282,10 +5282,11 @@ void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode QPointF center = g->center(); radialData.center.x = center.x(); radialData.center.y = center.y(); + radialData.center.radius = g->centerRadius(); QPointF focal = g->focalPoint(); radialData.focal.x = focal.x(); radialData.focal.y = focal.y(); - radialData.radius = g->radius(); + radialData.focal.radius = g->focalRadius(); } break; diff --git a/src/gui/painting/qpaintengineex.cpp b/src/gui/painting/qpaintengineex.cpp index 509fb77d25..7f601eb755 100644 --- a/src/gui/painting/qpaintengineex.cpp +++ b/src/gui/painting/qpaintengineex.cpp @@ -1012,4 +1012,50 @@ void QPaintEngineEx::updateState(const QPaintEngineState &) // do nothing... } +Q_GUI_EXPORT QPainterPath qt_painterPathFromVectorPath(const QVectorPath &path) +{ + const qreal *points = path.points(); + const QPainterPath::ElementType *types = path.elements(); + + QPainterPath p; + if (types) { + int id = 0; + for (int i=0; isave(); state->matrix = QTransform(); - state->dirtyFlags |= QPaintEngine::DirtyTransform; - updateState(state); + if (extended) { + extended->transformChanged(); + } else { + state->dirtyFlags |= QPaintEngine::DirtyTransform; + updateState(state); + } engine->drawImage(absPathRect, image, QRectF(0, 0, absPathRect.width(), absPathRect.height()), @@ -688,11 +692,14 @@ void QPainterPrivate::updateInvMatrix() invMatrix = state->matrix.inverted(); } +extern bool qt_isExtendedRadialGradient(const QBrush &brush); + void QPainterPrivate::updateEmulationSpecifier(QPainterState *s) { bool alpha = false; bool linearGradient = false; bool radialGradient = false; + bool extendedRadialGradient = false; bool conicalGradient = false; bool patternBrush = false; bool xform = false; @@ -724,6 +731,7 @@ void QPainterPrivate::updateEmulationSpecifier(QPainterState *s) (brushStyle == Qt::LinearGradientPattern)); radialGradient = ((penBrushStyle == Qt::RadialGradientPattern) || (brushStyle == Qt::RadialGradientPattern)); + extendedRadialGradient = radialGradient && (qt_isExtendedRadialGradient(penBrush) || qt_isExtendedRadialGradient(s->brush)); conicalGradient = ((penBrushStyle == Qt::ConicalGradientPattern) || (brushStyle == Qt::ConicalGradientPattern)); patternBrush = (((penBrushStyle > Qt::SolidPattern @@ -807,7 +815,7 @@ void QPainterPrivate::updateEmulationSpecifier(QPainterState *s) s->emulationSpecifier &= ~QPaintEngine::LinearGradientFill; // Radial gradient emulation - if (radialGradient && !engine->hasFeature(QPaintEngine::RadialGradientFill)) + if (extendedRadialGradient || (radialGradient && !engine->hasFeature(QPaintEngine::RadialGradientFill))) s->emulationSpecifier |= QPaintEngine::RadialGradientFill; else s->emulationSpecifier &= ~QPaintEngine::RadialGradientFill; diff --git a/src/gui/painting/qpainter.h b/src/gui/painting/qpainter.h index e8cc3a6bdb..601c386059 100644 --- a/src/gui/painting/qpainter.h +++ b/src/gui/painting/qpainter.h @@ -553,6 +553,7 @@ private: friend class QPaintEngine; friend class QPaintEngineExPrivate; friend class QOpenGLPaintEngine; + friend class QVGPaintEngine; friend class QX11PaintEngine; friend class QX11PaintEnginePrivate; friend class QWin32PaintEngine; diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp index 8068aa8524..207ab3d07c 100644 --- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp +++ b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp @@ -495,6 +495,8 @@ GLuint QGLEngineShaderManager::getUniformLocation(Uniform id) "fmp", "fmp2_m_radius2", "inverse_2_fmp2_m_radius2", + "sqrfr", + "bradius", "invertedTextureSize", "brushTransform", "brushTexture", diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h index 7cc9dc3bd4..bf2fe429c3 100644 --- a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h +++ b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h @@ -442,6 +442,8 @@ public: Fmp, Fmp2MRadius2, Inverse2Fmp2MRadius2, + SqrFr, + BRadius, InvertedTextureSize, BrushTransform, BrushTexture, diff --git a/src/opengl/gl2paintengineex/qglengineshadersource_p.h b/src/opengl/gl2paintengineex/qglengineshadersource_p.h index fc8b9ef4db..9362c5812b 100644 --- a/src/opengl/gl2paintengineex/qglengineshadersource_p.h +++ b/src/opengl/gl2paintengineex/qglengineshadersource_p.h @@ -241,6 +241,7 @@ static const char* const qglslPositionWithRadialGradientBrushVertexShader = "\n\ uniform mediump vec2 halfViewportSize; \n\ uniform highp mat3 brushTransform; \n\ uniform highp vec2 fmp; \n\ + uniform highp vec3 bradius; \n\ varying highp float b; \n\ varying highp vec2 A; \n\ void setPosition(void) \n\ @@ -253,7 +254,7 @@ static const char* const qglslPositionWithRadialGradientBrushVertexShader = "\n\ mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\ A = hTexCoords.xy * invertedHTexCoordsZ; \n\ - b = 2.0 * dot(A, fmp); \n\ + b = bradius.x + 2.0 * dot(A, fmp); \n\ }\n"; static const char* const qglslAffinePositionWithRadialGradientBrushVertexShader @@ -263,13 +264,22 @@ static const char* const qglslRadialGradientBrushSrcFragmentShader = "\n\ uniform sampler2D brushTexture; \n\ uniform highp float fmp2_m_radius2; \n\ uniform highp float inverse_2_fmp2_m_radius2; \n\ + uniform highp float sqrfr; \n\ varying highp float b; \n\ varying highp vec2 A; \n\ + uniform highp vec3 bradius; \n\ lowp vec4 srcPixel() \n\ { \n\ - highp float c = -dot(A, A); \n\ - highp vec2 val = vec2((-b + sqrt(b*b - 4.0*fmp2_m_radius2*c)) * inverse_2_fmp2_m_radius2, 0.5); \n\ - return texture2D(brushTexture, val); \n\ + highp float c = sqrfr-dot(A, A); \n\ + highp float det = b*b - 4.0*fmp2_m_radius2*c; \n\ + lowp vec4 result = vec4(0.0); \n\ + if (det >= 0.0) { \n\ + highp float detSqrt = sqrt(det); \n\ + highp float w = max((-b - detSqrt) * inverse_2_fmp2_m_radius2, (-b + detSqrt) * inverse_2_fmp2_m_radius2); \n\ + if (bradius.y + w * bradius.z >= 0.0) \n\ + result = texture2D(brushTexture, vec2(w, 0.5)); \n\ + } \n\ + return result; \n\ }\n"; diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index 673f614c0d..38bd58d91c 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -301,7 +301,7 @@ void QGL2PaintEngineExPrivate::updateBrushUniforms() const QRadialGradient *g = static_cast(currentBrush.gradient()); QPointF realCenter = g->center(); QPointF realFocal = g->focalPoint(); - qreal realRadius = g->radius(); + qreal realRadius = g->centerRadius() - g->focalRadius(); translationPoint = realFocal; QPointF fmp = realCenter - realFocal; @@ -311,6 +311,12 @@ void QGL2PaintEngineExPrivate::updateBrushUniforms() shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::Fmp2MRadius2), fmp2_m_radius2); shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::Inverse2Fmp2MRadius2), GLfloat(1.0 / (2.0*fmp2_m_radius2))); + shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::SqrFr), + GLfloat(g->focalRadius() * g->focalRadius())); + shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::BRadius), + GLfloat(2 * (g->centerRadius() - g->focalRadius()) * g->focalRadius()), + g->focalRadius(), + g->centerRadius() - g->focalRadius()); QVector2D halfViewportSize(width*0.5, height*0.5); shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::HalfViewportSize), halfViewportSize); diff --git a/src/opengl/qpaintengine_opengl.cpp b/src/opengl/qpaintengine_opengl.cpp index 9da811a9d0..5fa9f32c8c 100644 --- a/src/opengl/qpaintengine_opengl.cpp +++ b/src/opengl/qpaintengine_opengl.cpp @@ -2119,6 +2119,7 @@ void QOpenGLPaintEnginePrivate::fillPath(const QPainterPath &path) updateGLMatrix(); } +extern bool qt_isExtendedRadialGradient(const QBrush &brush); static inline bool needsEmulation(Qt::BrushStyle style) { @@ -2129,9 +2130,11 @@ static inline bool needsEmulation(Qt::BrushStyle style) void QOpenGLPaintEnginePrivate::updateUseEmulation() { - use_emulation = !use_fragment_programs - && ((has_pen && needsEmulation(pen_brush_style)) - || (has_brush && needsEmulation(brush_style))); + use_emulation = (!use_fragment_programs + && ((has_pen && needsEmulation(pen_brush_style)) + || (has_brush && needsEmulation(brush_style)))) + || (has_pen && qt_isExtendedRadialGradient(cpen.brush())) + || (has_brush && qt_isExtendedRadialGradient(cbrush)); } void QOpenGLPaintEngine::updatePen(const QPen &pen) @@ -5447,50 +5450,7 @@ void QOpenGLPaintEngine::transformChanged() updateMatrix(state()->matrix); } -static QPainterPath painterPathFromVectorPath(const QVectorPath &path) -{ - const qreal *points = path.points(); - const QPainterPath::ElementType *types = path.elements(); - - QPainterPath p; - if (types) { - int id = 0; - for (int i=0; iuse_fragment_programs && needsEmulation(brush.style())) { + if ((!d->use_fragment_programs && needsEmulation(brush.style())) || qt_isExtendedRadialGradient(brush)) { QPainter *p = painter(); QBrush oldBrush = p->brush(); p->setBrush(brush); - qt_draw_helper(p->d_ptr.data(), painterPathFromVectorPath(path), QPainterPrivate::FillDraw); + qt_draw_helper(p->d_ptr.data(), qt_painterPathFromVectorPath(path), QPainterPrivate::FillDraw); p->setBrush(oldBrush); return; } @@ -5520,7 +5480,7 @@ void QOpenGLPaintEngine::fill(const QVectorPath &path, const QBrush &brush) drawRects(&r, 1); updatePen(old_pen); } else { - d->fillPath(painterPathFromVectorPath(path)); + d->fillPath(qt_painterPathFromVectorPath(path)); } updateBrush(old_brush, state()->brushOrigin); diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index 588c35ac5b..1f42e02c7b 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -173,6 +173,9 @@ public: bool forcePenChange; // Force a pen change, even if the same. bool forceBrushChange; // Force a brush change, even if the same. + bool hasExtendedRadialGradientPen; // Current pen's brush is extended radial gradient. + bool hasExtendedRadialGradientBrush; // Current brush is extended radial gradient. + VGPaintType penType; // Type of the last pen that was set. VGPaintType brushType; // Type of the last brush that was set. @@ -275,6 +278,27 @@ public: } } + inline bool needsEmulation(const QBrush &brush) const + { + extern bool qt_isExtendedRadialGradient(const QBrush &brush); + return qt_isExtendedRadialGradient(brush); + } + + inline bool needsEmulation() const + { + return hasExtendedRadialGradientPen || hasExtendedRadialGradientBrush; + } + + inline bool needsPenEmulation() const + { + return hasExtendedRadialGradientPen; + } + + inline bool needsBrushEmulation() const + { + return hasExtendedRadialGradientBrush; + } + // Set various modes, but only if different. inline void setImageMode(VGImageMode mode); inline void setRenderingQuality(VGRenderingQuality mode); @@ -355,6 +379,10 @@ void QVGPaintEnginePrivate::init() forcePenChange = true; forceBrushChange = true; + + hasExtendedRadialGradientPen = false; + hasExtendedRadialGradientBrush = false; + penType = (VGPaintType)0; brushType = (VGPaintType)0; @@ -1536,6 +1564,10 @@ bool QVGPaintEngine::end() void QVGPaintEngine::draw(const QVectorPath &path) { Q_D(QVGPaintEngine); + if (d->needsEmulation()) { + QPaintEngineEx::draw(path); + return; + } QVGPainterState *s = state(); VGPath vgpath = d->vectorPathToVGPath(path); if (!path.hasWindingFill()) @@ -1545,9 +1577,19 @@ void QVGPaintEngine::draw(const QVectorPath &path) vgDestroyPath(vgpath); } +extern QPainterPath qt_painterPathFromVectorPath(const QVectorPath &path); + void QVGPaintEngine::fill(const QVectorPath &path, const QBrush &brush) { Q_D(QVGPaintEngine); + if (d->needsEmulation(brush)) { + QPainter *p = painter(); + QBrush oldBrush = p->brush(); + p->setBrush(brush); + qt_draw_helper(p->d_ptr.data(), qt_painterPathFromVectorPath(path), QPainterPrivate::FillDraw); + p->setBrush(oldBrush); + return; + } VGPath vgpath = d->vectorPathToVGPath(path); if (!path.hasWindingFill()) d->fill(vgpath, brush, VG_EVEN_ODD); @@ -1559,6 +1601,10 @@ void QVGPaintEngine::fill(const QVectorPath &path, const QBrush &brush) void QVGPaintEngine::stroke(const QVectorPath &path, const QPen &pen) { Q_D(QVGPaintEngine); + if (d->needsEmulation(pen.brush())) { + QPaintEngineEx::stroke(path, pen); + return; + } VGPath vgpath = d->vectorPathToVGPath(path); d->stroke(vgpath, pen); vgDestroyPath(vgpath); @@ -2362,12 +2408,17 @@ void QVGPaintEngine::penChanged() { Q_D(QVGPaintEngine); d->dirty |= QPaintEngine::DirtyPen; + + d->hasExtendedRadialGradientPen = + state()->pen.style() != Qt::NoPen && d->needsEmulation(state()->pen.brush()); } void QVGPaintEngine::brushChanged() { Q_D(QVGPaintEngine); d->dirty |= QPaintEngine::DirtyBrush; + + d->hasExtendedRadialGradientPen = d->needsEmulation(state()->brush); } void QVGPaintEngine::brushOriginChanged() @@ -2546,6 +2597,11 @@ void QVGPaintEngine::fillRect(const QRectF &rect, const QBrush &brush) return; } + if (d->needsEmulation(brush)) { + QPaintEngineEx::fillRect(rect, brush); + return; + } + #if !defined(QVG_NO_MODIFY_PATH) VGfloat coords[8]; if (d->simpleTransform) { @@ -2623,6 +2679,10 @@ void QVGPaintEngine::fillRect(const QRectF &rect, const QColor &color) void QVGPaintEngine::drawRoundedRect(const QRectF &rect, qreal xrad, qreal yrad, Qt::SizeMode mode) { Q_D(QVGPaintEngine); + if (d->needsEmulation()) { + QPaintEngineEx::drawRoundedRect(rect, xrad, yrad, mode); + return; + } if (d->simpleTransform) { QVGPainterState *s = state(); VGPath vgpath = d->roundedRectPath(rect, xrad, yrad, mode); @@ -2639,6 +2699,10 @@ void QVGPaintEngine::drawRects(const QRect *rects, int rectCount) { #if !defined(QVG_NO_MODIFY_PATH) Q_D(QVGPaintEngine); + if (d->needsEmulation()) { + QPaintEngineEx::drawRects(rects, rectCount); + return; + } QVGPainterState *s = state(); for (int i = 0; i < rectCount; ++i, ++rects) { VGfloat coords[8]; @@ -2680,6 +2744,10 @@ void QVGPaintEngine::drawRects(const QRectF *rects, int rectCount) { #if !defined(QVG_NO_MODIFY_PATH) Q_D(QVGPaintEngine); + if (d->needsEmulation()) { + QPaintEngineEx::drawRects(rects, rectCount); + return; + } QVGPainterState *s = state(); for (int i = 0; i < rectCount; ++i, ++rects) { VGfloat coords[8]; @@ -2718,6 +2786,10 @@ void QVGPaintEngine::drawLines(const QLine *lines, int lineCount) { #if !defined(QVG_NO_MODIFY_PATH) Q_D(QVGPaintEngine); + if (d->needsEmulation()) { + QPaintEngineEx::drawLines(lines, lineCount); + return; + } QVGPainterState *s = state(); for (int i = 0; i < lineCount; ++i, ++lines) { VGfloat coords[4]; @@ -2746,6 +2818,10 @@ void QVGPaintEngine::drawLines(const QLineF *lines, int lineCount) { #if !defined(QVG_NO_MODIFY_PATH) Q_D(QVGPaintEngine); + if (d->needsEmulation()) { + QPaintEngineEx::drawLines(lines, lineCount); + return; + } QVGPainterState *s = state(); for (int i = 0; i < lineCount; ++i, ++lines) { VGfloat coords[4]; @@ -2775,6 +2851,10 @@ void QVGPaintEngine::drawEllipse(const QRectF &r) // Based on the description of vguEllipse() in the OpenVG specification. // We don't use vguEllipse(), to avoid unnecessary library dependencies. Q_D(QVGPaintEngine); + if (d->needsEmulation()) { + QPaintEngineEx::drawEllipse(r); + return; + } if (d->simpleTransform) { QVGPainterState *s = state(); VGPath path = vgCreatePath(VG_PATH_FORMAT_STANDARD, @@ -2825,6 +2905,10 @@ void QVGPaintEngine::drawPath(const QPainterPath &path) // Shortcut past the QPainterPath -> QVectorPath conversion, // converting the QPainterPath directly into a VGPath. Q_D(QVGPaintEngine); + if (d->needsEmulation()) { + QPaintEngineEx::drawPath(path); + return; + } QVGPainterState *s = state(); VGPath vgpath = d->painterPathToVGPath(path); if (path.fillRule() == Qt::OddEvenFill) @@ -2839,6 +2923,11 @@ void QVGPaintEngine::drawPoints(const QPointF *points, int pointCount) #if !defined(QVG_NO_MODIFY_PATH) Q_D(QVGPaintEngine); + if (d->needsPenEmulation()) { + QPaintEngineEx::drawPoints(points, pointCount); + return; + } + // Set up a new pen if necessary. QPen pen = state()->pen; if (pen.style() == Qt::NoPen) @@ -2873,6 +2962,11 @@ void QVGPaintEngine::drawPoints(const QPoint *points, int pointCount) #if !defined(QVG_NO_MODIFY_PATH) Q_D(QVGPaintEngine); + if (d->needsEmulation()) { + QPaintEngineEx::drawPoints(points, pointCount); + return; + } + // Set up a new pen if necessary. QPen pen = state()->pen; if (pen.style() == Qt::NoPen) @@ -2905,6 +2999,12 @@ void QVGPaintEngine::drawPoints(const QPoint *points, int pointCount) void QVGPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) { Q_D(QVGPaintEngine); + + if (d->needsEmulation()) { + QPaintEngineEx::drawPolygon(points, pointCount, mode); + return; + } + QVGPainterState *s = state(); VGPath path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, @@ -2952,6 +3052,12 @@ void QVGPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonD void QVGPaintEngine::drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) { Q_D(QVGPaintEngine); + + if (d->needsEmulation()) { + QPaintEngineEx::drawPolygon(points, pointCount, mode); + return; + } + QVGPainterState *s = state(); VGPath path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, @@ -3611,6 +3717,11 @@ void QVGPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) return; } + if (d->needsPenEmulation()) { + QPaintEngineEx::drawTextItem(p, textItem); + return; + } + // Get the glyphs and positions associated with the text item. QVarLengthArray positions; QVarLengthArray glyphs; diff --git a/tests/arthur/common/paintcommands.cpp b/tests/arthur/common/paintcommands.cpp index 7a018e3ce6..9273142905 100644 --- a/tests/arthur/common/paintcommands.cpp +++ b/tests/arthur/common/paintcommands.cpp @@ -346,8 +346,12 @@ void PaintCommands::staticInit() "gradient_setLinear 1.0 1.0 2.0 2.0"); DECL_PAINTCOMMAND("gradient_setRadial", command_gradient_setRadial, "^gradient_setRadial\\s+([\\w.]*)\\s+([\\w.]*)\\s+([\\w.]*)\\s?([\\w.]*)\\s?([\\w.]*)$", - "gradient_setRadial \n - C is the center\n - rad is the angle in degrees\n - F is the focal point", + "gradient_setRadial \n - C is the center\n - rad is the radius\n - F is the focal point", "gradient_setRadial 1.0 1.0 45.0 2.0 2.0"); + DECL_PAINTCOMMAND("gradient_setRadialExtended", command_gradient_setRadialExtended, + "^gradient_setRadialExtended\\s+([\\w.]*)\\s+([\\w.]*)\\s+([\\w.]*)\\s?([\\w.]*)\\s?([\\w.]*)\\s?([\\w.]*)$", + "gradient_setRadialExtended \n - C is the center\n - rad is the center radius\n - F is the focal point\n - frad is the focal radius", + "gradient_setRadialExtended 1.0 1.0 45.0 2.0 2.0 45.0"); DECL_PAINTCOMMAND("gradient_setLinearPen", command_gradient_setLinearPen, "^gradient_setLinearPen\\s+([\\w.]*)\\s+([\\w.]*)\\s+([\\w.]*)\\s+([\\w.]*)$", "gradient_setLinearPen ", @@ -2400,7 +2404,7 @@ void PaintCommands::command_gradient_setRadial(QRegExp re) double fy = convertToDouble(caps.at(5)); if (m_verboseMode) - printf(" -(lance) gradient_setRadial center=(%.2f, %.2f), radius=%.2f focal=(%.2f, %.2f), " + printf(" -(lance) gradient_setRadial center=(%.2f, %.2f), radius=%.2f, focal=(%.2f, %.2f), " "spread=%d\n", cx, cy, rad, fx, fy, m_gradientSpread); @@ -2414,6 +2418,32 @@ void PaintCommands::command_gradient_setRadial(QRegExp re) m_painter->setBrush(brush); } +/***************************************************************************************************/ +void PaintCommands::command_gradient_setRadialExtended(QRegExp re) +{ + QStringList caps = re.capturedTexts(); + double cx = convertToDouble(caps.at(1)); + double cy = convertToDouble(caps.at(2)); + double rad = convertToDouble(caps.at(3)); + double fx = convertToDouble(caps.at(4)); + double fy = convertToDouble(caps.at(5)); + double frad = convertToDouble(caps.at(6)); + + if (m_verboseMode) + printf(" -(lance) gradient_setRadialExtended center=(%.2f, %.2f), radius=%.2f, focal=(%.2f, %.2f), " + "focal radius=%.2f, spread=%d\n", + cx, cy, rad, fx, fy, frad, m_gradientSpread); + + QRadialGradient rg(QPointF(cx, cy), rad, QPointF(fx, fy), frad); + rg.setStops(m_gradientStops); + rg.setSpread(m_gradientSpread); + rg.setCoordinateMode(m_gradientCoordinate); + QBrush brush(rg); + QTransform brush_matrix = m_painter->brush().transform(); + brush.setTransform(brush_matrix); + m_painter->setBrush(brush); +} + /***************************************************************************************************/ void PaintCommands::command_gradient_setConical(QRegExp re) { diff --git a/tests/arthur/common/paintcommands.h b/tests/arthur/common/paintcommands.h index 2740412654..08c0e25a7b 100644 --- a/tests/arthur/common/paintcommands.h +++ b/tests/arthur/common/paintcommands.h @@ -179,6 +179,7 @@ private: void command_gradient_setConical(QRegExp re); void command_gradient_setLinear(QRegExp re); void command_gradient_setRadial(QRegExp re); + void command_gradient_setRadialExtended(QRegExp re); void command_gradient_setLinearPen(QRegExp re); void command_gradient_setSpread(QRegExp re); void command_gradient_setCoordinateMode(QRegExp re); diff --git a/tests/arthur/data/qps/radial_gradients_extended.qps b/tests/arthur/data/qps/radial_gradients_extended.qps new file mode 100644 index 0000000000..d80a149252 --- /dev/null +++ b/tests/arthur/data/qps/radial_gradients_extended.qps @@ -0,0 +1,95 @@ +path_addRect path 400 0 80 80 +path_addEllipse path 440 40 60 60 + +setRenderHint Antialiasing + +setPen black + +begin_block gradients +gradient_clearStops +gradient_appendStop 0 red +gradient_appendStop 0.25 orange +gradient_appendStop 0.5 yellow +gradient_appendStop 0.8 green +gradient_appendStop 1 cyan + +gradient_setSpread PadSpread +gradient_setRadialExtended 0 0 20 40 40 10 +drawRect 0 0 100 100 + +gradient_setSpread ReflectSpread +gradient_setRadialExtended 120 20 20 140 40 10 +drawEllipse 100 0 100 100 + +gradient_setSpread RepeatSpread +gradient_setRadialExtended 240 20 20 260 40 10 +drawRoundRect 200 0 100 100 + +gradient_clearStops +gradient_appendStop 0 3f7f7fff +gradient_appendStop 0.5 dfdfffff +gradient_appendStop 1 7f00007f + +gradient_setSpread PadSpread +gradient_setRadialExtended 320 20 20 340 40 10 +drawPolygon [300 0 390 0 350 99] + +gradient_setSpread ReflectSpread +gradient_setRadialExtended 420 20 20 440 40 10 +drawPath path + +gradient_setSpread RepeatSpread +gradient_setRadialExtended 520 20 20 540 40 10 +drawPie 500 0 100 100 720 4320 +end_block + +translate 0 100 +scale 1 2 +repeat_block gradients + +resetMatrix +translate 0 300 +brushTranslate 30 0 +brushScale 0.9 0.9 +repeat_block gradients + +# Some helpful info perhaps? +resetMatrix +setPen black + +drawText 610 50 "No XForm" +drawText 610 200 "scale 1x2" +drawText 610 300 "brush transform" +drawText 10 450 "Pad" +drawText 110 450 "Reflect" +drawText 210 450 "Repeat" +drawText 310 450 "Pad w/alpha" +drawText 410 450 "Reflect w/alpha" +drawText 510 450 "Repeat w/alpha" + +# Radius and focal indicators +setPen 3f000000 +setBrush nobrush + +begin_block ellipse_draw +setClipRect 0 0 100 100 +drawEllipse -30 -30 100 100 +drawEllipse 35 35 11 11 +translate 100 0 +end_block + +repeat_block ellipse_draw +repeat_block ellipse_draw +repeat_block ellipse_draw +repeat_block ellipse_draw +repeat_block ellipse_draw + +resetMatrix +translate 0 100 +scale 1 2 +repeat_block ellipse_draw +repeat_block ellipse_draw +repeat_block ellipse_draw +repeat_block ellipse_draw +repeat_block ellipse_draw +repeat_block ellipse_draw diff --git a/tests/arthur/data/qps/radial_gradients_extended_qps.png b/tests/arthur/data/qps/radial_gradients_extended_qps.png new file mode 100644 index 0000000000000000000000000000000000000000..45a3e6036c81f898390fcac28d3836f38e4cb42c GIT binary patch literal 107978 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 literal 0 HcmV?d00001