diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py
index b325f0c6c..ade4bc019 100644
--- a/openlp/core/lib/__init__.py
+++ b/openlp/core/lib/__init__.py
@@ -220,6 +220,7 @@ def image_to_byte(image):
``image``
The image to converted.
"""
+ log.debug(u'image_to_byte')
byte_array = QtCore.QByteArray()
# use buffer to store pixmap into byteArray
buffie = QtCore.QBuffer(byte_array)
@@ -249,6 +250,7 @@ def resize_image(image, width, height, background=QtCore.Qt.black):
The background colour defaults to black.
"""
+ log.debug(u'resize_image')
preview = QtGui.QImage(image)
if not preview.isNull():
# Only resize if different size
diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py
index 906ebb987..0e8aca432 100644
--- a/openlp/core/lib/htmlbuilder.py
+++ b/openlp/core/lib/htmlbuilder.py
@@ -27,8 +27,6 @@
import logging
from PyQt4 import QtWebKit
-from openlp.core.lib import image_to_byte
-
log = logging.getLogger(__name__)
HTMLSRC = u"""
@@ -301,8 +299,8 @@ def build_html(item, screen, alert, islive):
height = screen[u'size'].height()
theme = item.themedata
webkitvers = webkit_version()
- if item.bg_frame:
- image = u'data:image/png;base64,%s' % image_to_byte(item.bg_frame)
+ if item.bg_image_bytes:
+ image = u'data:image/png;base64,%s' % item.bg_image_bytes
else:
image = u''
html = HTMLSRC % (build_background_css(item, width, height),
diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py
index 0cb92ad39..b10b4636f 100644
--- a/openlp/core/lib/renderer.py
+++ b/openlp/core/lib/renderer.py
@@ -32,7 +32,8 @@ import logging
from PyQt4 import QtGui, QtCore, QtWebKit
from openlp.core.lib import resize_image, expand_tags, \
- build_lyrics_format_css, build_lyrics_outline_css
+ build_lyrics_format_css, build_lyrics_outline_css, image_to_byte
+
log = logging.getLogger(__name__)
@@ -54,6 +55,9 @@ class Renderer(object):
self.frame = None
self.bg_frame = None
self.bg_image = None
+ self.bg_image_bytes = None
+ self.web = QtWebKit.QWebView()
+ self.web.setVisible(False)
def set_theme(self, theme):
"""
@@ -66,15 +70,12 @@ class Renderer(object):
self._theme = theme
self.bg_frame = None
self.bg_image = None
+ self.bg_image_bytes = None
self._bg_image_filename = None
self.theme_name = theme.theme_name
if theme.background_type == u'image':
if theme.background_filename:
self._bg_image_filename = unicode(theme.background_filename)
- if self.frame:
- self.bg_image = resize_image(self._bg_image_filename,
- self.frame.width(),
- self.frame.height())
def set_text_rectangle(self, rect_main, rect_footer):
"""
@@ -88,7 +89,21 @@ class Renderer(object):
"""
log.debug(u'set_text_rectangle %s , %s' % (rect_main, rect_footer))
self._rect = rect_main
- self._rect_footer = rect_footer
+ self._rect_footer = rect_footer
+ self.page_width = self._rect.width()
+ self.page_height = self._rect.height()
+ if self._theme.display_shadow:
+ self.page_width -= int(self._theme.display_shadow_size)
+ self.page_height -= int(self._theme.display_shadow_size)
+ self.web.resize(self.page_width, self.page_height)
+ self.web_frame = self.web.page().mainFrame()
+ # Adjust width and height to account for shadow. outline done in css
+ self.page_shell = u'
' \
+ u'' % \
+ (build_lyrics_format_css(self._theme, self.page_width,
+ self.page_height), build_lyrics_outline_css(self._theme))
def set_frame_dest(self, frame_width, frame_height):
"""
@@ -110,15 +125,18 @@ class Renderer(object):
self.frame.width(), self.frame.height())
if self._theme.background_type == u'image':
self.bg_frame = QtGui.QImage(self.frame.width(),
- self.frame.height(), QtGui.QImage.Format_ARGB32_Premultiplied)
+ self.frame.height(),
+ QtGui.QImage.Format_ARGB32_Premultiplied)
painter = QtGui.QPainter()
painter.begin(self.bg_frame)
painter.fillRect(self.frame.rect(), QtCore.Qt.black)
if self.bg_image:
painter.drawImage(0, 0, self.bg_image)
painter.end()
+ self.bg_image_bytes = image_to_byte(self.bg_frame)
else:
self.bg_frame = None
+ self.bg_image_bytes = None
def format_slide(self, words, line_break):
"""
@@ -139,29 +157,16 @@ class Renderer(object):
lines = verse.split(u'\n')
for line in lines:
text.append(line)
- web = QtWebKit.QWebView()
- web.resize(self._rect.width(), self._rect.height())
- web.setVisible(False)
- frame = web.page().mainFrame()
- # Adjust width and height to account for shadow. outline done in css
- width = self._rect.width() - int(self._theme.display_shadow_size)
- height = self._rect.height() - int(self._theme.display_shadow_size)
- shell = u'' \
- u'
' % \
- (build_lyrics_format_css(self._theme, width, height),
- build_lyrics_outline_css(self._theme))
formatted = []
html_text = u''
styled_text = u''
- js_height = 'document.getElementById("main").scrollHeight'
for line in text:
styled_line = expand_tags(line) + line_end
styled_text += styled_line
- html = shell + styled_text + u'
'
- web.setHtml(html)
+ html = self.page_shell + styled_text + u'
'
+ self.web.setHtml(html)
# Text too long so go to next page
- text_height = int(frame.evaluateJavaScript(js_height).toString())
- if text_height > height:
+ if self.web_frame.contentsSize().height() > self.page_height:
formatted.append(html_text)
html_text = u''
styled_text = styled_line
diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py
index a6e494b01..e98ab4f01 100644
--- a/openlp/core/lib/rendermanager.py
+++ b/openlp/core/lib/rendermanager.py
@@ -223,7 +223,6 @@ class RenderManager(object):
The words to go on the slides.
"""
log.debug(u'format slide')
- self.build_text_rectangle(self.themedata)
return self.renderer.format_slide(words, line_break)
def calculate_default(self, screen):
diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py
index b0d453af5..e7ec9c2af 100644
--- a/openlp/core/lib/serviceitem.py
+++ b/openlp/core/lib/serviceitem.py
@@ -97,7 +97,7 @@ class ServiceItem(object):
self.themedata = None
self.main = None
self.footer = None
- self.bg_frame = None
+ self.bg_image_bytes = None
def _new_item(self):
"""
@@ -145,7 +145,7 @@ class ServiceItem(object):
"""
log.debug(u'Render called')
self._display_frames = []
- self.bg_frame = None
+ self.bg_image_bytes = None
line_break = True
if self.is_capable(ItemCapabilities.NoLineBreaks):
line_break = False
@@ -156,7 +156,7 @@ class ServiceItem(object):
theme = self.theme
self.main, self.footer = \
self.render_manager.set_override_theme(theme, useOverride)
- self.bg_frame = self.render_manager.renderer.bg_frame
+ self.bg_image_bytes = self.render_manager.renderer.bg_image_bytes
self.themedata = self.render_manager.renderer._theme
for slide in self._raw_frames:
before = time.time()
diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py
index a2b9dd81a..646bdebd5 100644
--- a/openlp/core/ui/maindisplay.py
+++ b/openlp/core/ui/maindisplay.py
@@ -341,7 +341,9 @@ class MainDisplay(DisplayWidget):
self.serviceItem = serviceItem
html = build_html(self.serviceItem, self.screen, self.parent.alertTab,
self.isLive)
+ log.debug(u'buildHtml - pre setHtml')
self.webView.setHtml(html)
+ log.debug(u'buildHtml - post setHtml')
if serviceItem.foot_text and serviceItem.foot_text:
self.footer(serviceItem.foot_text)
# if was hidden keep it hidden