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.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():

View File

@ -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