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));
119 qreal subPixelX, qreal subPixelY,
120 const QRectF &baseBounds)
122 QTransform transform;
126 transform = transform * QTransform().rotateRadians(shape.
rotation());
127 QRectF rotatedBounds = transform.mapRect(baseBounds);
128 transform = transform * QTransform::fromTranslate(-rotatedBounds.x(), -rotatedBounds.y());
131 return transform * QTransform::fromTranslate(subPixelX, subPixelY);
135 qreal subPixelX, qreal subPixelY,
136 const QSize &originalSize,
137 QTransform *outputTransform, QSize *outputSize)
140 subPixelX, subPixelY,
141 originalSize, 1.0, originalSize,
142 outputTransform, outputSize);
146 qreal subPixelX, qreal subPixelY,
147 const QSize &originalSize,
148 qreal baseScale,
const QSize &baseSize,
149 QTransform *outputTransform, QSize *outputSize)
153 QRectF originalBounds = QRectF(QPointF(), originalSize);
154 QTransform originalTransform =
baseBrushTransform(shape, subPixelX, subPixelY, originalBounds);
156 qreal realBaseScaleX = qreal(baseSize.width()) / originalSize.width();
157 qreal realBaseScaleY = qreal(baseSize.height()) / originalSize.height();
158 qreal scaleX = shape.
scaleX() / realBaseScaleX;
159 qreal scaleY = shape.
scaleY() / realBaseScaleY;
162 QRectF baseBounds = QRectF(QPointF(), baseSize);
164 QRectF mappedRect = originalTransform.mapRect(originalBounds);
170 *outputTransform = QTransform();
172 if (mappedRect.isValid()) {
173 QRect expectedDstRect =
roundRect(mappedRect);
177 QRect testingRect =
roundRect(transform.mapRect(baseBounds));
178 if (testingRect != expectedDstRect) {
179 warnKrita <<
"WARNING: expected and real dab rects do not coincide!";
180 warnKrita <<
" expected rect:" << expectedDstRect;
181 warnKrita <<
" real rect: " << testingRect;
188 width = expectedDstRect.x() + expectedDstRect.width();
189 height = expectedDstRect.y() + expectedDstRect.height();
193 width = qMax(1, width);
194 height = qMax(1, height);
198 qWarning() <<
"Brush transform generated an invalid rectangle!"
201 <<
ppVar(originalSize)
205 <<
ppVar(mappedRect);
209 *outputTransform = transform;
210 *outputSize = QSize(width, height);
261 qreal subPixelX, qreal subPixelY)
const
263 if (
m_levels.isEmpty())
return QImage();
265 qreal baseScale = -1.0;
268 const QImage &srcImage =
m_levels[level].image;
270 QTransform transform;
275 &transform, &dstSize);
277 if (transform.isIdentity() &&
278 srcImage.format() == QImage::Format_ARGB32) {
286 QImage dstImage(dstSize, QImage::Format_ARGB32);
298 while (transform.type() == QTransform::TxTranslate) {
299 const qreal scale = transform.m11();
300 const qreal fakeScale = scale - 10 * std::numeric_limits<qreal>::epsilon();
301 transform *= QTransform::fromScale(fakeScale, fakeScale);
304 QPainter gc(&dstImage);
308 gc.setRenderHints(QPainter::SmoothPixmapTransform);
309 gc.drawImage(QPointF(), srcImage);
317 if (
m_levels.isEmpty())
return QImage();
320 QSizeF transformedUnitSquare = transform.mapRect(QRectF(0, 0, 1, 1)).size();
321 qreal x = qAbs(transformedUnitSquare.width());
322 qreal y = qAbs(transformedUnitSquare.height());
323 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)