valentina/src/app/puzzle/vptilefactory.cpp

679 lines
23 KiB
C++
Raw Normal View History

#include "vptilefactory.h"
#include <QtSvg>
#include "../vwidgets/vmaingraphicsscene.h"
2021-08-09 14:09:10 +02:00
#include "layout/vpsheet.h"
#include "scene/vpmaingraphicsview.h"
#include "../vmisc/def.h"
#include "../vmisc/vcommonsettings.h"
2021-09-06 14:31:19 +02:00
#include "../vlayout/vprintlayout.h"
2021-09-08 09:41:35 +02:00
namespace
{
const QColor tileColor(180, 180, 180);
2021-09-11 18:39:38 +02:00
//---------------------------------------------------------------------------------------------------------------------
auto Grayscale(QImage image) -> QImage
{
for (int ii = 0; ii < image.height(); ii++)
{
uchar* scan = image.scanLine(ii);
int depth = 4;
for (int jj = 0; jj < image.width(); jj++)
{
QRgb* rgbpixel = reinterpret_cast<QRgb*>(scan + jj * depth);
int gray = qGray(*rgbpixel);
*rgbpixel = QColor(gray, gray, gray, qAlpha(*rgbpixel)).rgba();
}
}
return image;
}
//---------------------------------------------------------------------------------------------------------------------
auto WatermarkImageFromCache(const VWatermarkData &watermarkData, const QString &watermarkPath, qreal xScale,
qreal yScale, QString &error) -> QPixmap
{
QPixmap pixmap;
QString imagePath = AbsoluteMPath(watermarkPath, watermarkData.path);
QString imageCacheKey = QString("puzzle=path%1+rotation%3+grayscale%4+xscale%5+yxcale%6")
.arg(imagePath, QString::number(watermarkData.imageRotation),
2021-09-11 18:39:38 +02:00
watermarkData.grayscale ? trueStr : falseStr ).arg(xScale).arg(yScale);
if (not QPixmapCache::find(imageCacheKey, &pixmap))
{
QImageReader imageReader(imagePath);
QImage watermark = imageReader.read();
if (watermark.isNull())
{
error = imageReader.errorString();
return pixmap;
}
if (watermarkData.grayscale)
{
watermark = Grayscale(watermark);
}
QTransform t;
t.scale(1 / xScale, 1 / yScale);
watermark = watermark.transformed(t);
2021-09-11 18:39:38 +02:00
t = QTransform();
t.translate(watermark.width()/2., watermark.height()/2.);
t.rotate(-watermarkData.imageRotation);
t.translate(-watermark.width()/2., -watermark.height()/2.);
watermark = watermark.transformed(t);
2021-09-11 18:39:38 +02:00
pixmap = QPixmap::fromImage(watermark);
2021-09-11 18:39:38 +02:00
QPixmapCache::insert(imageCacheKey, pixmap);
}
return pixmap;
2021-09-08 09:41:35 +02:00
}
2021-09-11 18:39:38 +02:00
} // namespace
2021-09-08 09:41:35 +02:00
//---------------------------------------------------------------------------------------------------------------------
2021-08-17 17:49:28 +02:00
VPTileFactory::VPTileFactory(const VPLayoutPtr &layout, VCommonSettings *commonSettings):
m_layout(layout),
2021-09-07 19:26:35 +02:00
m_commonSettings(commonSettings)
{
}
//---------------------------------------------------------------------------------------------------------------------
void VPTileFactory::refreshTileInfos()
{
2021-08-17 17:49:28 +02:00
VPLayoutPtr layout = m_layout.toStrongRef();
if(not layout.isNull())
{
2021-08-25 15:58:50 +02:00
QSizeF tilesSize = layout->LayoutSettings().GetTilesSize();
2021-08-17 17:49:28 +02:00
QMarginsF tilesMargins = layout->LayoutSettings().GetTilesMargins();
2020-11-20 15:51:24 +01:00
// sets the drawing height
2021-08-25 15:58:50 +02:00
m_drawingAreaHeight = tilesSize.height();
2020-11-20 15:51:24 +01:00
2021-08-25 15:58:50 +02:00
if (not layout->LayoutSettings().IgnoreTilesMargins())
{
2021-09-07 19:26:35 +02:00
m_drawingAreaHeight -= tilesMargins.top() + tilesMargins.bottom();
2021-08-25 15:58:50 +02:00
}
2020-11-20 15:51:24 +01:00
2021-08-25 15:58:50 +02:00
// sets the drawing width
m_drawingAreaWidth = tilesSize.width();
2020-11-20 15:51:24 +01:00
2021-08-25 15:58:50 +02:00
if (not layout->LayoutSettings().IgnoreTilesMargins())
2020-11-20 15:51:24 +01:00
{
2021-09-07 19:26:35 +02:00
m_drawingAreaWidth -= tilesMargins.left() + tilesMargins.right();
2020-11-20 15:51:24 +01:00
}
2021-09-11 18:39:38 +02:00
m_watermarkData = layout->WatermarkData();
}
}
//---------------------------------------------------------------------------------------------------------------------
2021-09-06 14:31:19 +02:00
void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheetPtr &sheet, int row, int col)
{
2021-09-06 14:31:19 +02:00
SCASSERT(painter != nullptr)
SCASSERT(printer != nullptr)
2021-08-17 17:49:28 +02:00
VPLayoutPtr layout = m_layout.toStrongRef();
if(layout.isNull())
{
2021-09-06 14:31:19 +02:00
return;
}
if (sheet.isNull())
{
return;
}
2021-09-07 19:26:35 +02:00
QMarginsF sheetMargins;
if (not sheet->IgnoreMargins())
{
sheetMargins = sheet->GetSheetMargins();
}
2021-09-06 14:31:19 +02:00
const int nbCol = ColNb(sheet);
const int nbRow = RowNb(sheet);
if (row < 0 || row > nbRow || col < 0 || col > nbCol)
{
return;
2021-08-17 17:49:28 +02:00
}
2021-09-06 14:31:19 +02:00
2021-09-08 09:41:35 +02:00
QPen penTileInfos = QPen(tileColor, m_commonSettings->WidthHairLine(), Qt::DashLine, Qt::RoundCap,
2021-08-17 17:49:28 +02:00
Qt::RoundJoin);
QPen penTileDrawing = QPen(Qt::black, m_commonSettings->WidthMainLine(), Qt::SolidLine, Qt::RoundCap,
Qt::RoundJoin);
2021-09-06 15:56:56 +02:00
painter->setPen(penTileDrawing);
2021-09-06 14:31:19 +02:00
// paint the content of the page
2021-09-06 15:56:56 +02:00
qreal xScale = layout->LayoutSettings().HorizontalScale();
qreal yScale = layout->LayoutSettings().VerticalScale();
2021-09-07 19:26:35 +02:00
QRectF source = QRectF(sheetMargins.left() + col*(m_drawingAreaWidth - tileStripeWidth) / xScale,
sheetMargins.top() + row*(m_drawingAreaHeight - tileStripeWidth) / yScale,
m_drawingAreaWidth / xScale,
m_drawingAreaHeight / yScale);
QRectF target = QRectF(0,
0,
m_drawingAreaWidth,
m_drawingAreaHeight);
2021-09-06 15:56:56 +02:00
sheet->SceneData()->Scene()->render(painter, VPrintLayout::SceneTargetRect(printer, target), source,
2021-09-06 14:31:19 +02:00
Qt::IgnoreAspectRatio);
QScopedPointer<QSvgRenderer> svgRenderer(new QSvgRenderer());
// ------------- prepare triangles for position marks
QRectF rectBasic = QRectF(-UnitConvertor(0.5, Unit::Cm, Unit::Px),
0,
UnitConvertor(1, Unit::Cm, Unit::Px),
UnitConvertor(0.5, Unit::Cm, Unit::Px)
);
QPainterPath triangleBasic;
triangleBasic.moveTo(rectBasic.topLeft());
triangleBasic.lineTo(rectBasic.topRight());
triangleBasic.lineTo(rectBasic.left() + (rectBasic.width() / 2), rectBasic.bottom());
triangleBasic.lineTo(rectBasic.topLeft());
QBrush triangleBush = QBrush(QColor(200,200,200));
// add the tiles decorations (cutting and gluing lines, scissors, infos etc.)
painter->setPen(penTileInfos);
if(row > 0)
{
// add top triangle
QPainterPath triangleTop =
QTransform()
2021-09-07 19:26:35 +02:00
.translate(m_drawingAreaWidth/2, 0)
.map(triangleBasic);
painter->fillPath(triangleTop, triangleBush);
// scissors along the top line
svgRenderer->load(QStringLiteral("://puzzleicon/svg/icon_scissors_horizontal.svg"));
2021-09-07 19:26:35 +02:00
svgRenderer->render(painter, QRectF(m_drawingAreaWidth - tileStripeWidth, 0,
UnitConvertor(0.95, Unit::Cm, Unit::Px),
2021-09-06 14:31:19 +02:00
UnitConvertor(0.56, Unit::Cm, Unit::Px)));
// dashed top line (for cutting)
penTileInfos.setStyle(Qt::DashLine);
painter->setPen(penTileInfos);
2021-09-07 19:26:35 +02:00
painter->drawLine(QPointF(), QPointF(m_drawingAreaWidth, 0));
}
else
{
// solid top line stopping at the edge
penTileInfos.setStyle(Qt::SolidLine);
painter->setPen(penTileInfos);
2021-09-07 19:26:35 +02:00
if(col < nbCol - 1)
{
painter->drawLine(QPointF(), QPointF(m_drawingAreaWidth, 0));
}
else
{
painter->drawLine(QPointF(), QPointF(m_drawingAreaWidth - tileStripeWidth, 0));
}
}
if(col > 0)
{
// add left triangle
QPainterPath triangleLeft =
QTransform()
2021-09-07 19:26:35 +02:00
.translate(0, m_drawingAreaHeight/2)
.rotate(-90)
.map(triangleBasic);
painter->fillPath(triangleLeft, triangleBush);
// scissors along the left line
svgRenderer->load(QStringLiteral("://puzzleicon/svg/icon_scissors_vertical.svg"));
2021-09-07 19:26:35 +02:00
svgRenderer->render(painter, QRectF(0, m_drawingAreaHeight - tileStripeWidth,
UnitConvertor(0.56, Unit::Cm, Unit::Px),
UnitConvertor(0.95, Unit::Cm, Unit::Px)));
// dashed left line (for cutting)
penTileInfos.setStyle(Qt::DashLine);
painter->setPen(penTileInfos);
2021-09-07 19:26:35 +02:00
painter->drawLine(QPointF(), QPointF(0, m_drawingAreaHeight));
}
else
{
// solid left line at the edge
penTileInfos.setStyle(Qt::SolidLine);
painter->setPen(penTileInfos);
2021-09-07 19:26:35 +02:00
if(row < nbRow - 1)
{
painter->drawLine(QPointF(), QPointF(0, m_drawingAreaHeight));
}
else
{
painter->drawLine(QPointF(), QPointF(0, m_drawingAreaHeight - tileStripeWidth));
}
}
2021-09-06 14:31:19 +02:00
if(row < nbRow-1)
{
// add bottom triangle
QPainterPath triangleBottom =
QTransform()
2021-09-07 19:26:35 +02:00
.translate(m_drawingAreaWidth/2, m_drawingAreaHeight - tileStripeWidth)
.rotate(180)
.map(triangleBasic);
painter->fillPath(triangleBottom, triangleBush);
// dotted bottom line (for glueing)
penTileInfos.setStyle(Qt::DotLine);
painter->setPen(penTileInfos);
2021-09-07 19:26:35 +02:00
painter->drawLine(QPointF(0, m_drawingAreaHeight - tileStripeWidth),
QPointF(m_drawingAreaWidth, m_drawingAreaHeight - tileStripeWidth));
2021-09-06 14:31:19 +02:00
}
else
{
// solid bottom line at the edge
penTileInfos.setStyle(Qt::SolidLine);
painter->setPen(penTileInfos);
2021-09-07 19:26:35 +02:00
if(col < nbCol - 1)
{
painter->drawLine(QPointF(0, m_drawingAreaHeight - tileStripeWidth),
QPointF(m_drawingAreaWidth, m_drawingAreaHeight - tileStripeWidth));
}
else
{
painter->drawLine(QPointF(0, m_drawingAreaHeight - tileStripeWidth),
QPointF(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight - tileStripeWidth));;
}
}
2021-09-08 09:41:35 +02:00
DrawRuler(painter);
2021-09-11 18:39:38 +02:00
DrawWatermark(painter);
2021-09-08 09:41:35 +02:00
2021-09-06 14:31:19 +02:00
if(col < nbCol-1)
{
// add right triangle
QPainterPath triangleRight =
QTransform()
2021-09-07 19:26:35 +02:00
.translate(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight/2)
.rotate(90)
.map(triangleBasic);
painter->fillPath(triangleRight, triangleBush);
// dotted right line (for glueing)
penTileInfos.setStyle(Qt::DotLine);
painter->setPen(penTileInfos);
2021-09-07 19:26:35 +02:00
painter->drawLine(QPointF(m_drawingAreaWidth - tileStripeWidth, 0),
QPointF(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight));
}
else
{
// solid right line at the edge
penTileInfos.setStyle(Qt::SolidLine);
painter->setPen(penTileInfos);
2021-09-07 19:26:35 +02:00
if(row < nbRow - 1)
{
painter->drawLine(QPointF(m_drawingAreaWidth - tileStripeWidth, 0),
QPointF(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight));
}
else
{
painter->drawLine(QPointF(m_drawingAreaWidth - tileStripeWidth, 0),
QPointF(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight - tileStripeWidth));
}
}
// prepare the painting for the text information
QTextDocument td;
2021-09-07 19:26:35 +02:00
td.setPageSize(QSizeF(m_drawingAreaWidth - UnitConvertor(2, Unit::Cm, Unit::Px), m_drawingAreaHeight));
// paint the grid information
const QString grid = tr("Grid ( %1 , %2 )").arg(row+1).arg(col+1);
2021-09-08 09:41:35 +02:00
const QString tileColorStr = QString("%1,%2,%3").arg(tileColor.red()).arg(tileColor.green()).arg(tileColor.blue());
2021-09-08 09:41:35 +02:00
td.setHtml(QString("<table width='100%' style='color:rgb(%1);'>"
"<tr>"
2021-09-08 09:41:35 +02:00
"<td align='center'>%2</td>"
"</tr>"
"</table>")
2021-09-08 09:41:35 +02:00
.arg(tileColorStr, grid));
painter->setPen(penTileInfos);
painter->save();
2021-09-08 09:41:35 +02:00
painter->translate(QPointF(UnitConvertor(1, Unit::Cm, Unit::Px), m_drawingAreaHeight - tileStripeWidth/1.3));
td.drawContents(painter);
painter->restore();
// paint the page information
2021-09-06 14:31:19 +02:00
const QString page = tr("Page %1 of %2").arg(row*nbCol+col+1).arg(nbCol*nbRow);
td.setPageSize(QSizeF(m_drawingAreaHeight - UnitConvertor(2, Unit::Cm, Unit::Px), m_drawingAreaWidth));
2021-09-06 14:31:19 +02:00
QFontMetrics metrix = QFontMetrics(td.defaultFont());
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
int maxWidth = metrix.horizontalAdvance(QString().fill('z', 50));
#else
int maxWidth = metrix.width(QString().fill('z', 50));
#endif
QString clippedSheetName = metrix.elidedText(sheet->GetName(), Qt::ElideMiddle, maxWidth);
2021-09-06 14:31:19 +02:00
2021-09-08 09:41:35 +02:00
td.setHtml(QString("<table width='100%' style='color:rgb(%1);'>"
"<tr>"
2021-09-08 09:41:35 +02:00
"<td align='center'>%2 - %3</td>"
"</tr>"
"</table>")
2021-09-08 09:41:35 +02:00
.arg(tileColorStr).arg(page).arg(clippedSheetName));
painter->save();
painter->rotate(-90);
2021-09-07 19:26:35 +02:00
painter->translate(QPointF(-(m_drawingAreaHeight) + UnitConvertor(1, Unit::Cm, Unit::Px),
m_drawingAreaWidth - tileStripeWidth));
td.drawContents(painter);
painter->restore();
}
//---------------------------------------------------------------------------------------------------------------------
2021-09-06 14:31:19 +02:00
auto VPTileFactory::RowNb(const VPSheetPtr &sheet) const -> int
{
2021-09-06 14:31:19 +02:00
if (sheet.isNull())
{
return 0;
}
2021-09-06 15:56:56 +02:00
qreal yScale = 1;
VPLayoutPtr layout = m_layout.toStrongRef();
if(not layout.isNull())
{
yScale = layout->LayoutSettings().VerticalScale();
}
2021-09-08 17:32:43 +02:00
QRectF sheetSize = sheet->GetMarginsRect();
2021-09-07 19:26:35 +02:00
return qCeil(sheetSize.height() * yScale / (m_drawingAreaHeight - tileStripeWidth));
}
//---------------------------------------------------------------------------------------------------------------------
2021-09-06 14:31:19 +02:00
auto VPTileFactory::ColNb(const VPSheetPtr &sheet) const -> int
{
2021-09-06 14:31:19 +02:00
if (sheet.isNull())
{
return 0;
}
2021-09-06 15:56:56 +02:00
qreal xScale = 1;
VPLayoutPtr layout = m_layout.toStrongRef();
if(not layout.isNull())
{
xScale = layout->LayoutSettings().HorizontalScale();
}
2021-09-08 17:32:43 +02:00
QRectF sheetSize = sheet->GetMarginsRect();
2021-09-07 19:26:35 +02:00
return qCeil(sheetSize.width() * xScale / (m_drawingAreaWidth - tileStripeWidth));
}
//---------------------------------------------------------------------------------------------------------------------
2021-09-06 14:31:19 +02:00
auto VPTileFactory::DrawingAreaHeight() const -> qreal
{
return m_drawingAreaHeight;
}
//---------------------------------------------------------------------------------------------------------------------
2021-09-06 14:31:19 +02:00
auto VPTileFactory::DrawingAreaWidth() const -> qreal
{
return m_drawingAreaWidth;
}
2021-09-08 09:41:35 +02:00
2021-09-11 18:39:38 +02:00
//---------------------------------------------------------------------------------------------------------------------
auto VPTileFactory::WatermarkData() const -> const VWatermarkData &
{
return m_watermarkData;
}
2021-09-08 09:41:35 +02:00
//---------------------------------------------------------------------------------------------------------------------
void VPTileFactory::DrawRuler(QPainter *painter)
{
VPLayoutPtr layout = m_layout.toStrongRef();
if(layout.isNull())
{
return;
}
QPen rulePen(tileColor, 1, Qt::SolidLine);
painter->save();
painter->setPen(rulePen);
const qreal notchHeight = UnitConvertor(3, Unit::Mm, Unit::Px);
const qreal shortNotchHeight = UnitConvertor(1.1, Unit::Mm, Unit::Px);
Unit layoutUnits = layout->LayoutSettings().GetUnit();
const qreal step = UnitConvertor(1, layoutUnits, Unit::Px);
double marksCount = (m_drawingAreaWidth-tileStripeWidth) / step;
int i = 0;
while (i < marksCount)
{
if (i != 0)
{ // don't need 0 notch
// middle ruler line
painter->drawLine(QPointF(step * i - step / 2., m_drawingAreaHeight-tileStripeWidth),
QPointF(step * i - step / 2., m_drawingAreaHeight - tileStripeWidth + shortNotchHeight));
// ruler line
painter->drawLine(QPointF(step * i, m_drawingAreaHeight-tileStripeWidth),
QPointF(step * i, m_drawingAreaHeight - tileStripeWidth + notchHeight));
}
else
{
QString units = layoutUnits == Unit::Cm || layoutUnits == Unit::Mm ? tr("cm", "unit") : tr("in", "unit");
QFont fnt = painter->font();
fnt.setPointSize(10);
qreal unitsWidth = 0;
QFontMetrics fm(fnt);
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
unitsWidth = fm.horizontalAdvance(units);
#else
unitsWidth = fm.width(units);
#endif
painter->drawText(QPointF(step*0.5-unitsWidth*0.6,
m_drawingAreaHeight - tileStripeWidth + notchHeight+shortNotchHeight), units);
}
++i;
}
painter->restore();
}
2021-09-11 18:39:38 +02:00
//---------------------------------------------------------------------------------------------------------------------
void VPTileFactory::DrawWatermark(QPainter *painter)
{
SCASSERT(painter != nullptr)
VPLayoutPtr layout = m_layout.toStrongRef();
if(layout.isNull())
{
return;
}
if (m_watermarkData.opacity > 0)
{
QRectF img(0, 0,
m_drawingAreaWidth - tileStripeWidth,
m_drawingAreaHeight - tileStripeWidth);
if (m_watermarkData.showImage && not m_watermarkData.path.isEmpty())
{
PaintWatermarkImage(painter, img, m_watermarkData,
layout->LayoutSettings().WatermarkPath());
2021-09-11 18:39:38 +02:00
}
if (m_watermarkData.showText && not m_watermarkData.text.isEmpty())
{
PaintWatermarkText(painter, img, m_watermarkData);
2021-09-11 18:39:38 +02:00
}
}
}
//---------------------------------------------------------------------------------------------------------------------
void VPTileFactory::PaintWatermarkText(QPainter *painter, const QRectF &img, const VWatermarkData &watermarkData,
qreal xScale, qreal yScale)
{
SCASSERT(painter != nullptr)
painter->save();
painter->setOpacity(watermarkData.opacity/100.);
QPen pen = painter->pen();
pen.setWidth(1);
pen.setColor(watermarkData.textColor);
pen.setStyle(Qt::SolidLine);
painter->setPen(pen);
painter->setBrush(watermarkData.textColor);
QTransform t;
t.translate(img.center().x(), img.center().y());
t.rotate(-watermarkData.textRotation);
t.translate(-img.center().x(), -img.center().y());
t.scale(xScale, yScale);
QPainterPath text;
text.addText(img.center(), watermarkData.font, watermarkData.text);
text = t.map(text);
QPointF center = img.center() - text.boundingRect().center();
t = QTransform();
t.translate(center.x(), center.y());
text = t.map(text);
painter->drawPath(text);
painter->restore();
}
//---------------------------------------------------------------------------------------------------------------------
void VPTileFactory::PaintWatermarkImage(QPainter *painter, const QRectF &img, const VWatermarkData &watermarkData,
const QString &watermarkPath, qreal xScale, qreal yScale)
{
SCASSERT(painter != nullptr)
const qreal opacity = watermarkData.opacity/100.;
auto BrokenImage = [img, watermarkData, watermarkPath, opacity]()
2021-09-11 18:39:38 +02:00
{
QPixmap watermark;
QString imagePath = QString("puzzle=path%1+opacity%2_broken")
.arg(AbsoluteMPath(watermarkPath, watermarkData.path), QString::number(opacity));
if (not QPixmapCache::find(imagePath, &watermark))
{
QScopedPointer<QSvgRenderer> svgRenderer(new QSvgRenderer());
QRect imageRect(0, 0, qRound(img.width()/4.), qRound(img.width()/4.));
watermark = QPixmap(imageRect.size());
watermark.fill(Qt::transparent);
QPainter imagePainter(&watermark);
imagePainter.setOpacity(opacity);
svgRenderer->load(QStringLiteral("://puzzleicon/svg/no_watermark_image.svg"));
svgRenderer->render(&imagePainter, imageRect);
QPixmapCache::insert(imagePath, watermark);
return watermark;
}
return watermark;
};
QString imagePath = AbsoluteMPath(watermarkPath, watermarkData.path);
QFileInfo f(imagePath);
QImageReader imageReader(imagePath);
QImage watermarkImage = imageReader.read();
if (watermarkImage.isNull())
{
QPixmap watermarkPixmap = BrokenImage();
if (watermarkPixmap.width() < img.width() && watermarkPixmap.height() < img.height())
{
QRect imagePosition(0, 0, watermarkPixmap.width(), watermarkPixmap.height());
imagePosition.translate(img.center().toPoint() - imagePosition.center());
painter->drawPixmap(imagePosition, watermarkPixmap);
}
else
{
painter->drawPixmap(img.toRect(), watermarkPixmap);
}
return;
}
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
qint64 fileSize = watermarkImage.byteCount();
#else
qint64 fileSize = watermarkImage.sizeInBytes();
#endif
qint64 pixelSize = fileSize / watermarkImage.height() / watermarkImage.width();
QSize scaledSize(qRound(watermarkImage.width() / xScale), qRound(watermarkImage.height() / yScale));
qint64 scaledImageSize = pixelSize*scaledSize.width()*scaledSize.height() / 1024;
int limit = QPixmapCache::cacheLimit();
if (scaledImageSize > limit && (xScale < 1 || yScale < 1))
{
QScopedPointer<QSvgRenderer> svgRenderer(new QSvgRenderer());
painter->save();
painter->setOpacity(opacity);
painter->restore();
QString grayscale = watermarkData.grayscale ? QStringLiteral("_grayscale") : QString();
svgRenderer->load(QStringLiteral("://puzzleicon/svg/watermark_placeholder%1.svg").arg(grayscale));
QRect imageRect(0, 0, qRound(watermarkImage.width() / xScale), qRound(watermarkImage.height() / yScale));
imageRect.translate(img.center().toPoint() - imageRect.center());
svgRenderer->render(painter, imageRect);
return;
}
2021-09-11 18:39:38 +02:00
QPixmap watermark;
if (f.suffix() == "png" || f.suffix() == "jpg" || f.suffix() == "jpeg" || f.suffix() == "bmp")
{
QString error;
watermark = WatermarkImageFromCache(watermarkData, watermarkPath, xScale, yScale, error);
if (watermark.isNull())
{
watermark = BrokenImage();
}
}
else
{
watermark = BrokenImage();
}
painter->save();
painter->setOpacity(watermarkData.opacity/100.);
2021-09-28 15:10:55 +02:00
QRect imagePosition(0, 0, watermark.width(), watermark.height());
imagePosition.translate(img.center().toPoint() - imagePosition.center());
2021-09-11 18:39:38 +02:00
if (watermark.width() < img.width() && watermark.height() < img.height())
{
painter->drawPixmap(imagePosition, watermark);
}
else
{
2021-09-28 15:10:55 +02:00
QRect croppedRect = imagePosition.intersected(img.toRect());
QPixmap cropped = watermark.copy(croppedRect.translated(-imagePosition.x(), -imagePosition.y()));
painter->drawPixmap(croppedRect, cropped);
2021-09-11 18:39:38 +02:00
}
painter->restore();
2021-09-11 18:39:38 +02:00
}