Initial version of Image performance improvements

This commit is contained in:
Tim Bentley 2010-10-22 18:24:56 +01:00
parent 63b3be4767
commit 6dbb80ee94
7 changed files with 22 additions and 61 deletions

View File

@ -314,6 +314,7 @@ def expand_tags(text):
from spelltextedit import SpellTextEdit from spelltextedit import SpellTextEdit
from eventreceiver import Receiver from eventreceiver import Receiver
from imagemanager import ImageManager
from settingsmanager import SettingsManager from settingsmanager import SettingsManager
from plugin import PluginStatus, StringContent, Plugin from plugin import PluginStatus, StringContent, Plugin
from pluginmanager import PluginManager from pluginmanager import PluginManager

View File

@ -73,7 +73,7 @@ class Renderer(object):
self.theme_name = theme.theme_name self.theme_name = theme.theme_name
if theme.background_type == u'image': if theme.background_type == u'image':
if theme.background_filename: if theme.background_filename:
self._bg_image_filename = unicode(theme.background_filename) self._bg_image_filename =theme.background_filename
def set_text_rectangle(self, rect_main, rect_footer): def set_text_rectangle(self, rect_main, rect_footer):
""" """
@ -118,25 +118,16 @@ class Renderer(object):
""" """
log.debug(u'set frame dest (frame) w %d h %d', frame_width, log.debug(u'set frame dest (frame) w %d h %d', frame_width,
frame_height) frame_height)
self.frame = QtGui.QImage(frame_width, frame_height,
QtGui.QImage.Format_ARGB32_Premultiplied)
if self._bg_image_filename and not self.bg_image:
self.bg_image = resize_image(self._bg_image_filename,
self.frame.width(), self.frame.height())
if self._theme.background_type == u'image': if self._theme.background_type == u'image':
self.bg_frame = QtGui.QImage(self.frame.width(), frame = QtGui.QImage(frame_width, frame_height,
self.frame.height(),
QtGui.QImage.Format_ARGB32_Premultiplied) QtGui.QImage.Format_ARGB32_Premultiplied)
painter = QtGui.QPainter() self.bg_image = resize_image(self._bg_image_filename,
painter.begin(self.bg_frame) frame.width(), frame.height())
painter.fillRect(self.frame.rect(), QtCore.Qt.black) self.bg_image_bytes = image_to_byte(self.bg_image)
if self.bg_image:
painter.drawImage(0, 0, self.bg_image)
painter.end()
self.bg_image_bytes = image_to_byte(self.bg_frame)
else: else:
self.bg_frame = None self.bg_frame = None
self.bg_image_bytes = None self.bg_image_bytes = None
log.debug(u'end frame dest (frame)')
def format_slide(self, words, line_break): def format_slide(self, words, line_break):
""" """

View File

@ -28,7 +28,7 @@ import logging
from PyQt4 import QtCore from PyQt4 import QtCore
from openlp.core.lib import Renderer, ThemeLevel, ServiceItem from openlp.core.lib import Renderer, ThemeLevel, ServiceItem, ImageManager
from openlp.core.ui import MainDisplay from openlp.core.ui import MainDisplay
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -56,6 +56,7 @@ class RenderManager(object):
""" """
log.debug(u'Initilisation started') log.debug(u'Initilisation started')
self.screens = screens self.screens = screens
self.image_manager = ImageManager()
self.display = MainDisplay(self, screens, False) self.display = MainDisplay(self, screens, False)
self.display.setup() self.display.setup()
self.theme_manager = theme_manager self.theme_manager = theme_manager
@ -78,6 +79,7 @@ class RenderManager(object):
self.display.setup() self.display.setup()
self.renderer.bg_frame = None self.renderer.bg_frame = None
self.themedata = None self.themedata = None
self.image_manager.update_display(self.width, self.height)
def set_global_theme(self, global_theme, theme_level=ThemeLevel.Global): def set_global_theme(self, global_theme, theme_level=ThemeLevel.Global):
""" """
@ -153,6 +155,8 @@ class RenderManager(object):
self.calculate_default(self.screens.current[u'size']) self.calculate_default(self.screens.current[u'size'])
self.renderer.set_theme(self.themedata) self.renderer.set_theme(self.themedata)
self.build_text_rectangle(self.themedata) self.build_text_rectangle(self.themedata)
self.image_manager.add_image(self.themedata.theme_name,
self.themedata.background_filename)
self.renderer.set_frame_dest(self.width, self.height) self.renderer.set_frame_dest(self.width, self.height)
return self.renderer._rect, self.renderer._rect_footer return self.renderer._rect, self.renderer._rect_footer

View File

@ -208,6 +208,7 @@ class ServiceItem(object):
self.service_item_type = ServiceItemType.Image self.service_item_type = ServiceItemType.Image
self._raw_frames.append( self._raw_frames.append(
{u'title': title, u'image': image, u'path': path}) {u'title': title, u'image': image, u'path': path})
self.render_manager.image_manager.add_image(title, path)
self._new_item() self._new_item()
def add_from_text(self, title, raw_slide, verse_tag=None): def add_from_text(self, title, raw_slide, verse_tag=None):
@ -389,7 +390,7 @@ class ServiceItem(object):
if self.service_item_type == ServiceItemType.Text: if self.service_item_type == ServiceItemType.Text:
return None, self._display_frames[row][u'html'].split(u'\n')[0] return None, self._display_frames[row][u'html'].split(u'\n')[0]
else: else:
return self._raw_frames[row][u'image'], u'' return self._raw_frames[row][u'title'], u''
def get_frame_title(self, row=0): def get_frame_title(self, row=0):
""" """

View File

@ -222,7 +222,7 @@ class MainDisplay(DisplayWidget):
shrinkItem.resize(self.screen[u'size'].width(), shrinkItem.resize(self.screen[u'size'].width(),
self.screen[u'size'].height()) self.screen[u'size'].height())
def image(self, image): def image(self, name):
""" """
Add an image as the background. The image is converted to a Add an image as the background. The image is converted to a
bytestream on route. bytestream on route.
@ -231,9 +231,8 @@ class MainDisplay(DisplayWidget):
The Image to be displayed can be QImage or QPixmap The Image to be displayed can be QImage or QPixmap
""" """
log.debug(u'image to display') log.debug(u'image to display')
if not isinstance(image, QtGui.QImage): image = self.parent.parent.RenderManager.image_manager. \
image = resize_image(image, self.screen[u'size'].width(), get_image(name)
self.screen[u'size'].height())
self.resetVideo() self.resetVideo()
self.displayImage(image) self.displayImage(image)
# show screen # show screen

View File

@ -37,24 +37,6 @@ from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class SlideThread(QtCore.QThread):
"""
A special Qt thread class to speed up the display of text based frames.
This is threaded so it loads the frames in background
"""
def __init__(self, parent, prefix, count):
QtCore.QThread.__init__(self, parent)
self.prefix = prefix
self.count = count
def run(self):
"""
Run the thread.
"""
time.sleep(1)
for i in range(0, self.count):
Receiver.send_message(u'%s_slide_cache' % self.prefix, i)
class SlideList(QtGui.QTableWidget): class SlideList(QtGui.QTableWidget):
""" """
Customised version of QTableWidget which can respond to keyboard Customised version of QTableWidget which can respond to keyboard
@ -410,8 +392,6 @@ class SlideController(QtGui.QWidget):
if self.isLive: if self.isLive:
QtCore.QObject.connect(self.volumeSlider, QtCore.QObject.connect(self.volumeSlider,
QtCore.SIGNAL(u'sliderReleased()'), self.mediaVolume) QtCore.SIGNAL(u'sliderReleased()'), self.mediaVolume)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'%s_slide_cache' % self.typePrefix), self.slideCache)
def screenSizeChanged(self): def screenSizeChanged(self):
""" """
@ -606,13 +586,9 @@ class SlideController(QtGui.QWidget):
label = QtGui.QLabel() label = QtGui.QLabel()
label.setMargin(4) label.setMargin(4)
label.setScaledContents(True) label.setScaledContents(True)
if isinstance(frame[u'image'], QtGui.QImage): image = self.parent.RenderManager.image_manager. \
label.setPixmap(QtGui.QPixmap.fromImage(frame[u'image'])) get_image(frame[u'title'])
else: label.setPixmap(QtGui.QPixmap.fromImage(image))
pixmap = resize_image(frame[u'image'],
self.parent.RenderManager.width,
self.parent.RenderManager.height)
label.setPixmap(QtGui.QPixmap.fromImage(pixmap))
self.PreviewListWidget.setCellWidget(framenumber, 0, label) self.PreviewListWidget.setCellWidget(framenumber, 0, label)
slideHeight = width * self.parent.RenderManager.screen_ratio slideHeight = width * self.parent.RenderManager.screen_ratio
row += 1 row += 1
@ -638,10 +614,6 @@ class SlideController(QtGui.QWidget):
self.PreviewListWidget.setFocus() self.PreviewListWidget.setFocus()
Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix,
[serviceItem]) [serviceItem])
if self.serviceItem.is_image():
st = SlideThread(
self, self.typePrefix, len(self.serviceItem.get_frames()))
st.start()
def onTextRequest(self): def onTextRequest(self):
""" """
@ -794,13 +766,6 @@ class SlideController(QtGui.QWidget):
% self.serviceItem.name.lower(), % self.serviceItem.name.lower(),
[self.serviceItem, self.isLive]) [self.serviceItem, self.isLive])
def slideCache(self, slide):
"""
Generate a slide cache item rendered and ready for use
in the background.
"""
self.serviceItem.get_rendered_frame(int(slide))
def onSlideSelected(self): def onSlideSelected(self):
""" """
Generate the preview when you click on a slide. Generate the preview when you click on a slide.

View File

@ -166,9 +166,9 @@ class ImageMediaItem(MediaManagerItem):
for item in items: for item in items:
bitem = self.listView.item(item.row()) bitem = self.listView.item(item.row())
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
frame = QtGui.QImage(unicode(filename)) #frame = QtGui.QImage(unicode(filename))
(path, name) = os.path.split(filename) (path, name) = os.path.split(filename)
service_item.add_from_image(path, name, frame) service_item.add_from_image(path, name, None)
return True return True
else: else:
return False return False