38 if (useSmoothingForEnlarging) {
39 appendPyramidLevel(baseImage.scaled(scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
41 appendPyramidLevel(baseImage.scaled(scaledSize, Qt::IgnoreAspectRatio, Qt::FastTransformation));
57 if (scaledSize.width() == 0 ||
58 scaledSize.height() == 0)
break;
60 appendPyramidLevel(baseImage.scaled(scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
132 qreal subPixelX, qreal subPixelY,
133 const QRectF &baseBounds)
135 QTransform transform;
139 transform = transform * QTransform().rotateRadians(shape.
rotation());
140 QRectF rotatedBounds = transform.mapRect(baseBounds);
141 transform = transform * QTransform::fromTranslate(-rotatedBounds.x(), -rotatedBounds.y());
144 return transform * QTransform::fromTranslate(subPixelX, subPixelY);
148 qreal subPixelX, qreal subPixelY,
149 const QSize &originalSize,
150 QTransform *outputTransform, QSize *outputSize)
153 subPixelX, subPixelY,
154 originalSize, 1.0, originalSize,
155 outputTransform, outputSize);
159 qreal subPixelX, qreal subPixelY,
160 const QSize &originalSize,
161 qreal baseScale,
const QSize &baseSize,
162 QTransform *outputTransform, QSize *outputSize)
166 QRectF originalBounds = QRectF(QPointF(), originalSize);
167 QTransform originalTransform =
baseBrushTransform(shape, subPixelX, subPixelY, originalBounds);
169 qreal realBaseScaleX = qreal(baseSize.width()) / originalSize.width();
170 qreal realBaseScaleY = qreal(baseSize.height()) / originalSize.height();
171 qreal scaleX = shape.
scaleX() / realBaseScaleX;
172 qreal scaleY = shape.
scaleY() / realBaseScaleY;
175 QRectF baseBounds = QRectF(QPointF(), baseSize);
177 QRectF mappedRect = originalTransform.mapRect(originalBounds);
183 *outputTransform = QTransform();
185 if (mappedRect.isValid()) {
186 QRect expectedDstRect =
roundRect(mappedRect);
190 QRect testingRect =
roundRect(transform.mapRect(baseBounds));
191 if (testingRect != expectedDstRect) {
192 warnKrita <<
"WARNING: expected and real dab rects do not coincide!";
193 warnKrita <<
" expected rect:" << expectedDstRect;
194 warnKrita <<
" real rect: " << testingRect;
201 width = expectedDstRect.x() + expectedDstRect.width();
202 height = expectedDstRect.y() + expectedDstRect.height();
206 width = qMax(1, width);
207 height = qMax(1, height);
211 qWarning() <<
"Brush transform generated an invalid rectangle!"
214 <<
ppVar(originalSize)
218 <<
ppVar(mappedRect);
222 *outputTransform = transform;
223 *outputSize = QSize(width, height);
274 qreal subPixelX, qreal subPixelY)
const
276 if (
m_levels.isEmpty())
return QImage();
278 qreal baseScale = -1.0;
281 const QImage &srcImage =
m_levels[level].image;
283 QTransform transform;
288 &transform, &dstSize);
290 if (transform.isIdentity() &&
291 srcImage.format() == QImage::Format_ARGB32) {
299 QImage dstImage(dstSize, QImage::Format_ARGB32);
311 while (transform.type() == QTransform::TxTranslate) {
312 const qreal scale = transform.m11();
313 const qreal fakeScale = scale - 10 * std::numeric_limits<qreal>::epsilon();
314 transform *= QTransform::fromScale(fakeScale, fakeScale);
317 QPainter gc(&dstImage);
321 gc.setRenderHints(QPainter::SmoothPixmapTransform);
322 gc.drawImage(QPointF(), srcImage);
330 if (
m_levels.isEmpty())
return QImage();
333 QSizeF transformedUnitSquare = transform.mapRect(QRectF(0, 0, 1, 1)).size();
334 qreal x = qAbs(transformedUnitSquare.width());
335 qreal y = qAbs(transformedUnitSquare.height());
336 qreal estimatedScale = (x > y) ? transformedUnitSquare.width() : transformedUnitSquare.height();
static void calculateParams(KisDabShape const &shape, qreal subPixelX, qreal subPixelY, const QSize &originalSize, QTransform *outputTransform, QSize *outputSize)