61{
65 }
66
69 }
70
73 }
74
77 }
78
80 }
81
82 qreal
scale = additionalScale;
83 qreal rotation = additionalRotation;
84 bool needsUpdate = false;
85
86
88 needsUpdate = true;
89 d->lastUpdateTime.restart();
90 }
91
93 if (!
d->sizeOption->isRandom() || needsUpdate) {
94 d->lastSizeApplied =
d->sizeOption->apply(info);
95 }
96 scale *=
d->lastSizeApplied;
97 }
98
99 if (
d->rotationOption && !tilt) {
100 if (!
d->rotationOption->isRandom() || needsUpdate) {
101 d->lastRotationApplied =
d->rotationOption->apply(info);
102 }
103 rotation +=
d->lastRotationApplied;
104 }
else if (
d->rotationOption && tilt) {
106 }
107
108 qreal xFlip = 1.0;
109 qreal yFlip = 1.0;
110
111 if (
d->mirrorOption) {
112 if (!
d->mirrorOption->isRandom() || needsUpdate) {
113 d->lastMirrorApplied =
d->mirrorOption->apply(info);
114 }
115
116 if (
d->lastMirrorApplied.coordinateSystemFlipped) {
117 rotation = 2 *
M_PI - rotation;
118 }
119
120 if (
d->lastMirrorApplied.horizontalMirror) {
121 xFlip = -1.0;
122 }
123
124 if (
d->lastMirrorApplied.verticalMirror) {
125 yFlip = -1.0;
126 }
127 }
128
129 QTransform rot;
130 rot.rotateRadians(-rotation);
131
132 QPointF hotSpot = originalOutline.
boundingRect().center();
133 if (tilt) {
134 hotSpot.setX(tiltcenterx);
135 hotSpot.setY(tiltcentery);
136 }
137
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;
146 }
147
148
150
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);
154
155 return originalOutline.
mapped(T1 * rot *
S * T2);
156}
Eigen::Matrix< double, 4, 2 > S
KisStandardOption< KisSizeOptionData > KisSizeOption
QRectF boundingRect() const
KisOptimizedBrushOutline mapped(const QTransform &t) const
#define NOISY_UPDATE_SPEED
QPointF alignForZoom(const QPointF &pt, qreal zoom)