Image BrushStrokerCustomBrush::drawDabImage(const TabletInputData &data, QRect *rect) { Q_ASSERT(data.pressure > 0); Vec2D radiusVec; radiusVec.rx() = radiusBase() * data.pressure; radiusVec.ry() = radiusVec.x() * (1.0 - _setting.flattening); _lastMinorRadius = radiusVec.y(); //qDebug() << "radius" << radiusVec.x << radiusVec.y; QPainterPath ellipse; ellipse.addEllipse(data.pos, radiusVec.x(), radiusVec.y()); QRect dabRect; if (_setting.rotation) { QTransform rotation; rotation.rotate(_setting.rotation); ellipse = rotation.map(ellipse); dabRect = ellipse.boundingRect().toAlignedRect(); } else { dabRect = QRectF(QPointF(data.pos - radiusVec), QSizeF(2.0 * radiusVec)).toAlignedRect(); } Image dabImage(dabRect.size()); dabImage.clear(); Painter dabPainter(&dabImage); dabPainter.translateShape(-dabRect.topLeft()); if (_setting.tableWidth == 1 && _setting.tableHeight == 1) { // no gradient dabPainter.setPixel(pixel()); } else { ArgbGradient gradient; gradient.addStop(0, pixel()); gradient.addStop(_setting.tableWidth, pixel() * _setting.tableHeight); gradient.addStop(1, Pixel(0)); dabPainter.setBrush(Malachite::Brush::fromRadialGradient(gradient, data.pos, radiusVec)); } dabPainter.drawPath(ellipse); dabPainter.end(); *rect = dabRect; return dabImage; }