r21327 by craig -
scribus-commit
scribus-commit at lists.scribus.net
Mon May 16 13:39:39 UTC 2016
Author: craig
Date: Mon May 16 13:39:39 2016
New Revision: 21327
URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=21327
Log:
#14004: Apply Khaled Hosny's patch for better HiDPi support on canvas
Modified:
trunk/Scribus/scribus/canvas.cpp
trunk/Scribus/scribus/canvas.h
trunk/Scribus/scribus/scpainter.cpp
trunk/Scribus/scribus/scribusapp.cpp
Modified: trunk/Scribus/scribus/canvas.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=21327&path=/trunk/Scribus/scribus/canvas.cpp
==============================================================================
--- trunk/Scribus/scribus/canvas.cpp (original)
+++ trunk/Scribus/scribus/canvas.cpp Mon May 16 13:39:39 2016
@@ -671,7 +671,7 @@
{
// qDebug() << "adjust buffer: invalid buffer, viewport" << viewport;
m_bufferRect = viewport;
- m_buffer = QPixmap(m_bufferRect.width(), m_bufferRect.height());
+ m_buffer = createPixmap(m_bufferRect.width(), m_bufferRect.height());
fillBuffer(&m_buffer, m_bufferRect.topLeft(), m_bufferRect);
ret = true;
#if DRAW_DEBUG_LINES
@@ -699,8 +699,7 @@
{
// qDebug() << "adjust buffer: fresh buffer" << m_bufferRect << "-->" << newRect;
m_bufferRect = newRect;
-// m_buffer = QImage(m_bufferRect.width(), m_bufferRect.height(), QImage::Format_ARGB32);
- m_buffer = QPixmap(m_bufferRect.width(), m_bufferRect.height());
+ m_buffer = createPixmap(m_bufferRect.width(), m_bufferRect.height());
fillBuffer(&m_buffer, m_bufferRect.topLeft(), m_bufferRect);
ret = true;
#if DRAW_DEBUG_LINES
@@ -714,8 +713,7 @@
else
{
// copy buffer:
-// QImage newBuffer(newRect.width(), newRect.height(), QImage::Format_ARGB32);
- QPixmap newBuffer(newRect.width(), newRect.height());
+ QPixmap newBuffer = createPixmap(newRect.width(), newRect.height());
QPainter p(&newBuffer);
int xpos = m_bufferRect.x() - newRect.x();
int ypos = m_bufferRect.y() - newRect.y();
@@ -743,8 +741,8 @@
{
height = newRect.height() - ypos;
}
-// p.drawImage(xpos, ypos, m_buffer, x, y, width + 1, height + 1); // FIXME: == params drawPixmap?
- p.drawPixmap(xpos, ypos, m_buffer, x, y, width + 1, height + 1);
+
+ drawPixmap(p, xpos, ypos, m_buffer, x, y, width + 1, height + 1);
#if DRAW_DEBUG_LINES
p.setPen(Qt::blue);
p.drawLine(xpos, ypos+height/2, xpos+width/2, ypos);
@@ -826,11 +824,7 @@
#endif
// fill buffer if necessary
bool bufferFilled = adjustBuffer();
- // It is ugly, but until we figure out why drawing directly on the
- // widget is so slow, it saves us a Cray! - pm
- QPixmap tmpImg(p->rect().size());
- QPainter qp(&tmpImg);
- qp.translate(-p->rect().x(), -p->rect().y());
+ QPainter qp(this);
switch (m_renderMode)
{
case RENDER_NORMAL:
@@ -858,8 +852,7 @@
int hV = p->rect().height();
if (hV > 0 && wV > 0)
{
-// qp.drawImage(p->rect().x(), p->rect().y(), m_buffer, xV, yV, wV, hV);
- qp.drawPixmap(p->rect().x(), p->rect().y(), m_buffer, xV, yV, wV, hV);
+ drawPixmap(qp, p->rect().x(), p->rect().y(), m_buffer, xV, yV, wV, hV);
#if DRAW_DEBUG_LINES
// qDebug() << "normal rendering" << xV << yV << wV << hV << "at" << p->rect().x() << p->rect().y();
qp.setPen(Qt::blue);
@@ -912,9 +905,7 @@
#endif
if (hV > 0 && wV > 0)
{
-// qp.drawImage(p->rect().x(), p->rect().y(), m_buffer, xV, yV, wV, hV);
-
- qp.drawPixmap(p->rect().x(), p->rect().y(), m_buffer, xV, yV, wV, hV);
+ drawPixmap(qp, p->rect().x(), p->rect().y(), m_buffer, xV, yV, wV, hV);
#if DRAW_DEBUG_LINES
// qDebug() << "buffered rendering" << xV << yV << wV << hV << "at" << p->rect().x() << p->rect().y();
qp.setPen(Qt::green);
@@ -956,8 +947,6 @@
// does mode specific rendering, currently selection in legacymode and nodes in nodeedit
m_view->m_canvasMode->drawControls(&qp);
m_view->m_canvasMode->drawSnapLine(&qp);
- QPainter tp(this);
- tp.drawPixmap(p->rect(), tmpImg, tmpImg.rect());
#ifdef SHOW_ME_WHAT_YOU_GET_IN_D_CANVA
t6 = t.elapsed();
qDebug()<<dmode<<t1<<t2<<t3<<t4<<t5<<t6<<"-" <<t1+t2+t3+t4+t5+t6;
@@ -977,7 +966,8 @@
// qDebug() << "Canvas::drawContents" << clipx << clipy << clipw << cliph<<m_viewMode.forceRedraw<<m_viewMode.operItemSelecting;
uint docPagesCount=m_doc->Pages->count();
ScPainter *painter=0;
- QImage img = QImage(clipw, cliph, QImage::Format_ARGB32_Premultiplied);
+ QImage img = QImage(clipw * devicePixelRatio(), cliph * devicePixelRatio(), QImage::Format_ARGB32_Premultiplied);
+ img.setDevicePixelRatio(devicePixelRatio());
painter = new ScPainter(&img, img.width(), img.height(), 1.0, 0);
painter->clear(palette().color(QPalette::Window));
painter->newPath();
@@ -2419,6 +2409,22 @@
end.transform(pi2->xPos(), pi2->yPos(), pi2->rotation(), 1, 1, false);
}
+QPixmap Canvas::createPixmap(double w, double h)
+{
+ QPixmap p(w * devicePixelRatio(), h * devicePixelRatio());
+ p.setDevicePixelRatio(devicePixelRatio());
+ return p;
+}
+
+void Canvas::drawPixmap(QPainter& painter, double x, double y, const QPixmap& pixmap, double sx, double sy, double sw, double sh)
+{
+ sx *= devicePixelRatio();
+ sy *= devicePixelRatio();
+ sw *= devicePixelRatio();
+ sh *= devicePixelRatio();
+ painter.drawPixmap(x, y, pixmap, sx, sy, sw, sh);
+}
+
void Canvas::displayXYHUD(QPoint m)
{
if (!PrefsManager::instance()->appPrefs.displayPrefs.showMouseCoordinates)
Modified: trunk/Scribus/scribus/canvas.h
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=21327&path=/trunk/Scribus/scribus/canvas.h
==============================================================================
--- trunk/Scribus/scribus/canvas.h (original)
+++ trunk/Scribus/scribus/canvas.h Mon May 16 13:39:39 2016
@@ -261,6 +261,11 @@
void getLinkedFrames(PageItem* currItem);
void getClipPathForPages(FPointArray* PoLine);
void calculateFrameLinkPoints(PageItem* pi1, PageItem* pi2, FPoint& start, FPoint& end);
+
+ // create a potentially hidpi pixmap
+ QPixmap createPixmap(double w, double h);
+ // draw a potentially hidpi pixmap
+ void drawPixmap(QPainter &painter, double x, double y, const QPixmap &pixmap, double sx, double sy, double sw, double sh);
private:
ScribusDoc* m_doc;
Modified: trunk/Scribus/scribus/scpainter.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=21327&path=/trunk/Scribus/scribus/scpainter.cpp
==============================================================================
--- trunk/Scribus/scribus/scpainter.cpp (original)
+++ trunk/Scribus/scribus/scpainter.cpp Mon May 16 13:39:39 2016
@@ -52,6 +52,7 @@
m_matrix = QTransform();
m_zoomStack.clear();
cairo_surface_t *img = cairo_image_surface_create_for_data(m_image->bits(), CAIRO_FORMAT_ARGB32, w, h, w*4);
+ cairo_surface_set_device_scale(img, m_image->devicePixelRatio(), m_image->devicePixelRatio());
m_cr = cairo_create(img);
cairo_save( m_cr );
cairo_set_fill_rule (m_cr, CAIRO_FILL_RULE_EVEN_ODD);
Modified: trunk/Scribus/scribus/scribusapp.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=21327&path=/trunk/Scribus/scribus/scribusapp.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusapp.cpp (original)
+++ trunk/Scribus/scribus/scribusapp.cpp Mon May 16 13:39:39 2016
@@ -110,7 +110,7 @@
m_scDLMgr = 0;
m_ScCore = NULL;
initDLMgr();
-
+ setAttribute(Qt::AA_UseHighDpiPixmaps, true);
}
ScribusQApp::~ScribusQApp()
More information about the scribus-commit
mailing list