mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
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:
parent
5a60972f66
commit
0296d09733
@ -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():
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user