E-book viewer: Fix "View Image" right click menu action not available for svg files included via <img> tags. Fixes #1657717 [Private bug](https://bugs.launchpad.net/calibre/+bug/1657717)

This commit is contained in:
Kovid Goyal 2017-01-21 14:18:13 +05:30
parent 5a60972f66
commit 0296d09733
2 changed files with 27 additions and 3 deletions

View File

@ -25,7 +25,7 @@ from calibre.gui2.viewer.keys import SHORTCUTS
from calibre.gui2.viewer.javascript import JavaScriptLoader from calibre.gui2.viewer.javascript import JavaScriptLoader
from calibre.gui2.viewer.position import PagePosition from calibre.gui2.viewer.position import PagePosition
from calibre.gui2.viewer.config import config, ConfigDialog, load_themes 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.table_popup import TablePopup
from calibre.gui2.viewer.inspector import WebInspector from calibre.gui2.viewer.inspector import WebInspector
from calibre.gui2.viewer.gestures import GestureHandler from calibre.gui2.viewer.gestures import GestureHandler
@ -729,6 +729,11 @@ class DocumentView(QWebView): # {{{
elem = r.element() elem = r.element()
if elem.isNull(): if elem.isNull():
elem = r.enclosingBlockElement() 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 table = None
parent = elem parent = elem
while not parent.isNull(): while not parent.isNull():

View File

@ -9,9 +9,27 @@ __docformat__ = 'restructuredtext en'
from PyQt5.Qt import (QDialog, QPixmap, QUrl, QScrollArea, QLabel, QSizePolicy, from PyQt5.Qt import (QDialog, QPixmap, QUrl, QScrollArea, QLabel, QSizePolicy,
QDialogButtonBox, QVBoxLayout, QPalette, QApplication, QSize, QIcon, 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): class ImageView(QDialog):
@ -146,6 +164,7 @@ class ImagePopup(object):
if not d.isVisible(): if not d.isVisible():
self.dialogs.remove(d) self.dialogs.remove(d)
if __name__ == '__main__': if __name__ == '__main__':
import sys import sys
from calibre.gui2 import Application from calibre.gui2 import Application