14 QGradient *gradient = 0;
16 case QGradient::LinearGradient:
17 gradient =
new QLinearGradient(QPointF(0.0, 0.5), QPointF(1, 0.5));
19 case QGradient::RadialGradient:
20 gradient =
new QRadialGradient(QPointF(0.5, 0.5), sqrt(0.5));
22 case QGradient::ConicalGradient:
23 gradient =
new QConicalGradient(QPointF(0.5, 0.5), 0.0);
28 gradient->setCoordinateMode(QGradient::ObjectBoundingMode);
29 gradient->setSpread(spread);
30 gradient->setStops(stops);
39 switch (gradient->type()) {
40 case QGradient::LinearGradient: {
41 const QLinearGradient *g =
static_cast<const QLinearGradient*
>(gradient);
43 stop = g->finalStop();
46 case QGradient::RadialGradient: {
47 const QRadialGradient *g =
static_cast<const QRadialGradient*
>(gradient);
49 stop = QPointF(g->radius(), 0.0);
52 case QGradient::ConicalGradient: {
53 const QConicalGradient *g =
static_cast<const QConicalGradient*
>(gradient);
55 qreal radAngle = g->angle() *
M_PI / 180.0;
56 stop = QPointF(0.5 * cos(radAngle), 0.5 * sin(radAngle));
60 start = QPointF(0.0, 0.0);
61 stop = QPointF(0.5, 0.5);
64 QGradient *newGradient = 0;
66 case QGradient::LinearGradient:
67 newGradient =
new QLinearGradient(start, stop);
69 case QGradient::RadialGradient: {
70 QPointF diff(stop - start);
71 qreal radius = sqrt(diff.x()*diff.x() + diff.y()*diff.y());
72 newGradient =
new QRadialGradient(start, radius, start);
75 case QGradient::ConicalGradient: {
76 QPointF diff(stop - start);
77 qreal angle = atan2(diff.y(), diff.x());
80 newGradient =
new QConicalGradient(start, angle * 180/
M_PI);
86 newGradient->setCoordinateMode(QGradient::ObjectBoundingMode);
87 newGradient->setSpread(gradient->spread());
88 newGradient->setStops(gradient->stops());
98 if (stops.count() == 1)
99 return stops.first().second;
101 QGradientStop prevStop(-1.0, QColor());
102 QGradientStop nextStop(2.0, QColor());
104 Q_FOREACH (
const QGradientStop & stop, stops) {
105 if (stop.first > prevStop.first && stop.first < position)
107 if (stop.first < nextStop.first && stop.first > position)
113 if (prevStop.first < 0.0) {
115 theColor = nextStop.second;
116 }
else if (nextStop.first > 1.0) {
118 theColor = prevStop.second;
121 QColor prevColor = prevStop.second, nextColor = nextStop.second;
122 qreal colorScale = (position - prevStop.first) / (nextStop.first - prevStop.first);
123 theColor.setRedF(prevColor.redF() + colorScale *(nextColor.redF() - prevColor.redF()));
124 theColor.setGreenF(prevColor.greenF() + colorScale *(nextColor.greenF() - prevColor.greenF()));
125 theColor.setBlueF(prevColor.blueF() + colorScale *(nextColor.blueF() - prevColor.blueF()));
126 theColor.setAlphaF(prevColor.alphaF() + colorScale *(nextColor.alphaF() - prevColor.alphaF()));