diff --git a/YACReader/continuous_page_widget.cpp b/YACReader/continuous_page_widget.cpp index 9391c1d1..514156c6 100644 --- a/YACReader/continuous_page_widget.cpp +++ b/YACReader/continuous_page_widget.cpp @@ -118,7 +118,9 @@ void ContinuousPageWidget::paintEvent(QPaintEvent *event) } QPainter painter(this); - scaledPageCache.invalidateForWidth(width()); + const qreal dpr = devicePixelRatioF(); + const int effectivePixelWidth = std::max(1, qRound(width() * dpr)); + scaledPageCache.invalidateForWidth(effectivePixelWidth); QRect visibleRect = event->rect(); int firstPage = continuousViewModel->pageAtY(visibleRect.top()); @@ -143,7 +145,7 @@ void ContinuousPageWidget::paintEvent(QPaintEvent *event) const QImage *img = render->bufferedImage(i); if (img && !img->isNull()) { - const QImage *drawable = scaledImageForPaint(i, img, scaled, width()); + const QImage *drawable = scaledImageForPaint(i, img, scaled, effectivePixelWidth, dpr); if (drawable) { painter.drawImage(pageRect, *drawable); } @@ -164,15 +166,15 @@ void ContinuousPageWidget::resizeEvent(QResizeEvent *event) } } -const QImage *ContinuousPageWidget::scaledImageForPaint(int pageIndex, const QImage *source, const QSize &targetSize, int effectiveWidth) +const QImage *ContinuousPageWidget::scaledImageForPaint(int pageIndex, const QImage *source, const QSize &targetSize, int effectiveWidth, qreal devicePixelRatio) { if (!source || source->isNull() || targetSize.isEmpty()) { return nullptr; } - if (source->size() == targetSize) { - return source; - } + const qreal dpr = std::max(1.0, devicePixelRatio); + const QSize targetPixelSize(std::max(1, qRound(targetSize.width() * dpr)), + std::max(1, qRound(targetSize.height() * dpr))); scaledPageCache.invalidateForWidth(effectiveWidth); @@ -181,7 +183,7 @@ const QImage *ContinuousPageWidget::scaledImageForPaint(int pageIndex, const QIm if (it != scaledPageCache.pages.end()) { const ScaledPageCacheEntry &entry = it.value(); - const bool validEntry = entry.sourceCacheKey == sourceKey && entry.sourceSize == source->size() && entry.targetSize == targetSize && !entry.scaledImage.isNull(); + const bool validEntry = entry.sourceCacheKey == sourceKey && entry.sourceSize == source->size() && entry.targetSize == targetSize && entry.targetPixelSize == targetPixelSize && qFuzzyCompare(entry.targetDevicePixelRatio, dpr) && !entry.scaledImage.isNull(); if (validEntry) { return &it.value().scaledImage; } @@ -191,8 +193,11 @@ const QImage *ContinuousPageWidget::scaledImageForPaint(int pageIndex, const QIm entry.sourceCacheKey = sourceKey; entry.sourceSize = source->size(); entry.targetSize = targetSize; - entry.scaledImage = scaleImage(*source, targetSize.width(), targetSize.height(), + entry.targetPixelSize = targetPixelSize; + entry.targetDevicePixelRatio = dpr; + entry.scaledImage = scaleImage(*source, targetPixelSize.width(), targetPixelSize.height(), Configuration::getConfiguration().getScalingMethod()); + entry.scaledImage.setDevicePixelRatio(dpr); scaledPageCache.pages.insert(pageIndex, std::move(entry)); return &scaledPageCache.pages[pageIndex].scaledImage; diff --git a/YACReader/continuous_page_widget.h b/YACReader/continuous_page_widget.h index 16be8f2f..aff9b809 100644 --- a/YACReader/continuous_page_widget.h +++ b/YACReader/continuous_page_widget.h @@ -40,6 +40,8 @@ private: qint64 sourceCacheKey = 0; QSize sourceSize; QSize targetSize; + QSize targetPixelSize; + qreal targetDevicePixelRatio = 1.0; QImage scaledImage; }; @@ -86,7 +88,7 @@ private: } }; - const QImage *scaledImageForPaint(int pageIndex, const QImage *source, const QSize &targetSize, int effectiveWidth); + const QImage *scaledImageForPaint(int pageIndex, const QImage *source, const QSize &targetSize, int effectiveWidth, qreal devicePixelRatio); Render *render = nullptr; ContinuousViewModel *continuousViewModel = nullptr; diff --git a/YACReader/viewer.cpp b/YACReader/viewer.cpp index 3a414351..3eb44db4 100644 --- a/YACReader/viewer.cpp +++ b/YACReader/viewer.cpp @@ -896,7 +896,6 @@ QImage Viewer::grabMagnifiedRegion(const QPoint &viewerPos, const QSize &glassSi const int resultH = static_cast(zoomH * hFactor); QImage result(resultW, resultH, QImage::Format_RGB32); - result.setDevicePixelRatio(devicePixelRatioF()); result.fill(bgColor); // zoom region in widget coordinates (centered on cursor)