Issue #123: Clipping images

This commit is contained in:
Jakub Melka
2024-02-22 19:43:43 +01:00
parent 5eb5069173
commit 54d093ab8c

View File

@ -266,12 +266,6 @@ void PDFBLPaintEngine::updateFont(QFont newFont)
void PDFBLPaintEngine::updateState(const QPaintEngineState& updatedState) void PDFBLPaintEngine::updateState(const QPaintEngineState& updatedState)
{ {
/* DirtyBrushOrigin = 0x0004,
DirtyBackground = 0x0010,
DirtyBackgroundMode = 0x0020,
DirtyClipRegion = 0x0080,
DirtyClipPath = 0x0100,*/
if (updatedState.state().testFlag(QPaintEngine::DirtyPen)) if (updatedState.state().testFlag(QPaintEngine::DirtyPen))
{ {
m_currentPen = updatedState.pen(); m_currentPen = updatedState.pen();
@ -534,7 +528,7 @@ void PDFBLPaintEngine::drawPathImpl(const QPainterPath& path, bool enableStroke,
BLPath blPath = getBLPath(path); BLPath blPath = getBLPath(path);
if (isFillActive() && enableFill) if ((isFillActive() && enableFill))
{ {
m_blContext->fillPath(blPath); m_blContext->fillPath(blPath);
} }
@ -622,6 +616,8 @@ void PDFBLPaintEngine::drawTextItem(const QPointF& p, const QTextItem& textItem)
currentPosition += glyphPositions[i]; currentPosition += glyphPositions[i];
} }
drawPathImpl(path, false, true);
m_blContext->save(); m_blContext->save();
setFillRule(path.fillRule()); setFillRule(path.fillRule());
m_blContext->setFillStyle(BLRgba32(m_currentPen.color().rgba())); m_blContext->setFillStyle(BLRgba32(m_currentPen.color().rgba()));
@ -682,6 +678,26 @@ void PDFBLPaintEngine::drawImage(const QRectF& r, const QImage& pm, const QRectF
image.convertTo(QImage::Format_ARGB32_Premultiplied); image.convertTo(QImage::Format_ARGB32_Premultiplied);
} }
if (clipMode == ClipMode::NeedsResolve)
{
QImage mask(image.size(), QImage::Format_ARGB32);
mask.fill(Qt::transparent);
QPainter maskPainter(&mask);
maskPainter.setCompositionMode(QPainter::CompositionMode_Source);
QPainterPath path = m_finalClipPath;
path = m_currentTransform.inverted().map(path);
maskPainter.fillPath(path, Qt::white);
maskPainter.end();
QPainter imagePainter(&image);
imagePainter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
imagePainter.drawImage(0, 0, mask);
imagePainter.end();
}
BLImage blImage; BLImage blImage;
blImage.createFromData(image.width(), image.height(), BL_FORMAT_PRGB32, image.bits(), image.bytesPerLine()); blImage.createFromData(image.width(), image.height(), BL_FORMAT_PRGB32, image.bits(), image.bytesPerLine());
@ -1093,7 +1109,7 @@ void PDFBLPaintEngine::updateClipping(std::optional<QRegion> clipRegion,
PDFBLPaintEngine::ClipMode PDFBLPaintEngine::resolveClipping(const QRectF& rect) const PDFBLPaintEngine::ClipMode PDFBLPaintEngine::resolveClipping(const QRectF& rect) const
{ {
if (!m_currentIsClipEnabled || m_clipSingleRect || m_finalClipPath.isEmpty()) if (!m_currentIsClipEnabled || m_clipSingleRect)
{ {
return ClipMode::NoClip; return ClipMode::NoClip;
} }