From 0296d097338424aedad5f591dc35596deb85e0cb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 21 Jan 2017 14:18:13 +0530 Subject: [PATCH] E-book viewer: Fix "View Image" right click menu action not available for svg files included via tags. Fixes #1657717 [Private bug](https://bugs.launchpad.net/calibre/+bug/1657717) --- src/calibre/gui2/viewer/documentview.py | 7 ++++++- src/calibre/gui2/viewer/image_popup.py | 23 +++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index a065bfa173..4e67c4bea8 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -25,7 +25,7 @@ from calibre.gui2.viewer.keys import SHORTCUTS from calibre.gui2.viewer.javascript import JavaScriptLoader from calibre.gui2.viewer.position import PagePosition from calibre.gui2.viewer.config import config, ConfigDialog, load_themes -from calibre.gui2.viewer.image_popup import ImagePopup +from calibre.gui2.viewer.image_popup import ImagePopup, render_svg from calibre.gui2.viewer.table_popup import TablePopup from calibre.gui2.viewer.inspector import WebInspector from calibre.gui2.viewer.gestures import GestureHandler @@ -729,6 +729,11 @@ class DocumentView(QWebView): # {{{ elem = r.element() if elem.isNull(): elem = r.enclosingBlockElement() + if img.isNull() and elem.tagName().lower() == 'img': + # QtWebKit return null pixmaps for svg images + iqurl = r.imageUrl() + path = self.path(iqurl) + img = render_svg(self, path) table = None parent = elem while not parent.isNull(): diff --git a/src/calibre/gui2/viewer/image_popup.py b/src/calibre/gui2/viewer/image_popup.py index 3799a49968..fde16842b9 100644 --- a/src/calibre/gui2/viewer/image_popup.py +++ b/src/calibre/gui2/viewer/image_popup.py @@ -9,9 +9,27 @@ __docformat__ = 'restructuredtext en' from PyQt5.Qt import (QDialog, QPixmap, QUrl, QScrollArea, QLabel, QSizePolicy, QDialogButtonBox, QVBoxLayout, QPalette, QApplication, QSize, QIcon, - Qt, QTransform) + Qt, QTransform, QSvgRenderer, QImage, QPainter) -from calibre.gui2 import choose_save_file, gprefs, NO_URL_FORMATTING +from calibre.gui2 import choose_save_file, gprefs, NO_URL_FORMATTING, max_available_height + + +def render_svg(widget, path): + img = QPixmap() + rend = QSvgRenderer() + if rend.load(path): + dpr = getattr(widget, 'devicePixelRatioF', widget.devicePixelRatio)() + sz = rend.defaultSize() + h = (max_available_height() - 50) + w = int(h * sz.height() / float(sz.width())) + pd = QImage(w * dpr, h * dpr, QImage.Format_RGB32) + pd.fill(Qt.white) + p = QPainter(pd) + rend.render(p) + p.end() + img = QPixmap.fromImage(pd) + img.setDevicePixelRatio(dpr) + return img class ImageView(QDialog): @@ -146,6 +164,7 @@ class ImagePopup(object): if not d.isVisible(): self.dialogs.remove(d) + if __name__ == '__main__': import sys from calibre.gui2 import Application