OXPicture FX::gradient(const QPoint c1, int r1, const QPoint c2, int r2, const ColorArray &colors, const PointArray &stops) { XRadialGradient rg = { { c1.x() << 16, c1.y() << 16, r1 << 16 }, { c2.x() << 16, c2.y() << 16, r2 << 16 } }; QVarLengthArray<XRenderColor> cs(colors.size()); for (int i = 0; i < colors.size(); ++i) setColor(cs[i], colors.at(i)); XFixed *stps; if (stops.size() < 2) { stps = new XFixed[2]; stps[0] = 0; stps[1] = (1<<16); } else { int d = ((int)(sqrt(pow(c2.x()-c1.x(),2)+pow(c2.y()-c1.y(),2)))) << 16; stps = new XFixed[stops.size()]; for (int i = 0; i < stops.size(); ++i) { if (stops.at(i) < 0) continue; if (stops.at(i) > 1) break; stps[i] = stops.at(i)*d; } } XFlush (dpy); OXPicture lgp = XRenderCreateRadialGradient(dpy, &rg, stps, &cs[0], qMin(qMax(stops.size(),2), colors.size())); delete[] stps; return lgp; }
OXPicture FX::gradient(const QPoint start, const QPoint stop, const ColorArray &colors, const PointArray &stops) { XLinearGradient lg = { { start.x() << 16, start.y() << 16 }, { stop.x() << 16, stop.y() << 16} }; QVarLengthArray<XRenderColor> cs(colors.size()); for (int i = 0; i < colors.size(); ++i) setColor(cs[i], colors.at(i)); XFixed *stps; if (stops.size() < 2) { stps = new XFixed[2]; stps[0] = 0; stps[1] = (1<<16); } else { int d = (1<<16); stps = new XFixed[stops.size()]; for (int i = 0; i < stops.size(); ++i) { if (stops.at(i) < 0) continue; if (stops.at(i) > 1) break; stps[i] = stops.at(i)*d; } } XFlush (dpy); OXPicture lgp = XRenderCreateLinearGradient(dpy, &lg, stps, &cs[0], qMin(qMax(stops.size(),2), colors.size())); delete[] stps; return lgp; }