Skip to content
This repository has been archived by the owner on May 30, 2023. It is now read-only.

Commit

Permalink
Add support for capturing viewport when rendering images
Browse files Browse the repository at this point in the history
Adds a new 'onlyViewport' option to the render API so that images can be captured
based on the viewport size when set to 'true' as opposed to being
captured as a page based on the content size when set to 'false'. The
'onlyViewport' option defaults to 'false' for backward compatibility.

Align on SlimerJS

Fixes #10619
  • Loading branch information
astefanutti committed May 11, 2016
1 parent 4ef5f27 commit bfccbd6
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 11 deletions.
32 changes: 22 additions & 10 deletions src/webpage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1013,7 +1013,13 @@ bool WebPage::render(const QString& fileName, const QVariantMap& option)
QPdfWriter pdfWriter(fileName);
retval = renderPdf(pdfWriter);
} else {
QImage rawPageRendering = renderImage();
RenderMode mode;
if (option.contains("onlyViewport") && option.value("onlyViewport").toBool()) {
mode = Viewport;
} else {
mode = Content;
}
QImage rawPageRendering = renderImage(mode);

const char* f = 0; // 0 is QImage#save default
if (format != "") {
Expand Down Expand Up @@ -1092,18 +1098,23 @@ QString WebPage::renderBase64(const QByteArray& format)
return bytes.toBase64();
}

QImage WebPage::renderImage()
QImage WebPage::renderImage(const RenderMode mode)
{
QSize contentsSize = m_mainFrame->contentsSize();
contentsSize -= QSize(m_scrollPosition.x(), m_scrollPosition.y());
QRect frameRect = QRect(QPoint(0, 0), contentsSize);
QRect frameRect;
QSize viewportSize = m_customWebPage->viewportSize();
if (mode == Viewport) {
frameRect = QRect(QPoint(0, 0), viewportSize);
} else {
QSize contentsSize = m_mainFrame->contentsSize();
contentsSize -= QSize(m_scrollPosition.x(), m_scrollPosition.y());
frameRect = QRect(QPoint(0, 0), contentsSize);
m_customWebPage->setViewportSize(contentsSize);
}

if (!m_clipRect.isNull()) {
frameRect = m_clipRect;
}

QSize viewportSize = m_customWebPage->viewportSize();
m_customWebPage->setViewportSize(contentsSize);

#ifdef Q_OS_WIN
QImage::Format format = QImage::Format_ARGB32_Premultiplied;
#else
Expand Down Expand Up @@ -1144,8 +1155,9 @@ QImage WebPage::renderImage()
painter.end();
}
}

m_customWebPage->setViewportSize(viewportSize);
if (mode != Viewport) {
m_customWebPage->setViewportSize(viewportSize);
}
return buffer;
}

Expand Down
3 changes: 2 additions & 1 deletion src/webpage.h
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,8 @@ private slots:
void handleCurrentFrameDestroyed();

private:
QImage renderImage();
enum RenderMode { Content, Viewport };
QImage renderImage(const RenderMode mode = Content);
bool renderPdf(QPdfWriter& pdfWriter);
void applySettings(const QVariantMap& defaultSettings);
QString userAgent() const;
Expand Down

0 comments on commit bfccbd6

Please sign in to comment.