82 qreal scale = additionalScale;
83 qreal rotation = additionalRotation;
84 bool needsUpdate =
false;
89 d->lastUpdateTime.restart();
93 if (!
d->sizeOption->isRandom() || needsUpdate) {
94 d->lastSizeApplied =
d->sizeOption->apply(info);
96 scale *=
d->lastSizeApplied;
99 if (
d->rotationOption && !tilt) {
100 if (!
d->rotationOption->isRandom() || needsUpdate) {
101 d->lastRotationApplied =
d->rotationOption->apply(info);
103 rotation +=
d->lastRotationApplied;
104 }
else if (
d->rotationOption && tilt) {
111 if (
d->mirrorOption) {
112 if (!
d->mirrorOption->isRandom() || needsUpdate) {
113 d->lastMirrorApplied =
d->mirrorOption->apply(info);
116 if (
d->lastMirrorApplied.coordinateSystemFlipped) {
117 rotation = 2 *
M_PI - rotation;
120 if (
d->lastMirrorApplied.horizontalMirror) {
124 if (
d->lastMirrorApplied.verticalMirror) {
130 rot.rotateRadians(-rotation);
132 QPointF hotSpot = originalOutline.
boundingRect().center();
134 hotSpot.setX(tiltcenterx);
135 hotSpot.setY(tiltcentery);
138 QPointF pos = info.
pos();
139 if (
d->sharpnessOption &&
d->sharpnessOption->alignOutlineToPixels()) {
142 qreal subPixelX = 0.0;
143 qreal subPixelY = 0.0;
144 d->sharpnessOption->apply(info, pos - hotSpot, x, y, subPixelX, subPixelY);
145 pos = QPointF(x + subPixelX, y + subPixelY) + hotSpot;
151 QTransform T1 = QTransform::fromTranslate(-hotSpot.x(), -hotSpot.y());
152 QTransform T2 = QTransform::fromTranslate(pos.x(), pos.y());
153 QTransform
S = QTransform::fromScale(xFlip * scale, yFlip * scale);
155 return originalOutline.
mapped(T1 * rot *
S * T2);
KisOptimizedBrushOutline fetchOutline(const KisPaintInformation &info, const KisPaintOpSettingsSP settings, const KisOptimizedBrushOutline &originalOutline, const KisPaintOpSettings::OutlineMode &mode, qreal alignForZoom, qreal additionalScale=1.0, qreal additionalRotation=0.0, bool tilt=false, qreal tiltcenterx=1.0, qreal tiltcentery=1.0) const