Add Preformance Monitoring for Renderer

Fix Pixmap problems with pixelation
Remove duplicate image plugin issue.
This commit is contained in:
Tim Bentley 2009-05-11 06:09:43 +01:00
parent a7d1ba85ed
commit b2d2de6ad8
9 changed files with 147 additions and 105 deletions

View File

@ -26,7 +26,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver
logging.basicConfig(level=logging.DEBUG,
format=u'%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
format=u'%(asctime)s %(msecs)d %(name)-12s %(levelname)-8s %(message)s',
datefmt=u'%m-%d %H:%M:%S',
filename=u'openlp.log',
filemode=u'w')

View File

@ -19,8 +19,9 @@ Place, Suite 330, Boston, MA 02111-1307 USA
"""
import logging
import os, os.path
import sys
from datetime import *
from PyQt4 import QtGui, QtCore, Qt
from copy import copy
@ -95,6 +96,7 @@ class Renderer:
self.img=QtGui.QPixmap.fromImage(i.scaled(QtCore.QSize(neww, newh), Qt.Qt.KeepAspectRatio))
def set_paint_dest(self, p):
log.debug(u'set paint dest (frame) w %d h %d',p.width(), p.height())
self._paint=p
if self._bg_image_filename is not None:
self.scale_bg_image()
@ -128,6 +130,7 @@ class Renderer:
assert(self._theme)
assert(self._paint)
log.debug(u'render background %s ', self._theme.background_type)
bef = datetime.now()
p=QtGui.QPainter()
p.begin(self._paint)
if self._theme.background_type == u'solid':
@ -172,6 +175,10 @@ class Renderer:
else:
p.fillRect(self._paint.rect(), QtGui.QColor(u'#000000'))
p.end()
aft = datetime.now()
print "background time", bef, aft, aft-bef
log.debug(u'render background finish')
def split_set_of_lines(self, lines, footer):
@ -250,7 +257,7 @@ class Renderer:
def render_lines(self, lines, footer_lines=None):
"""render a set of lines according to the theme, return bounding box"""
log.debug(u'_render_lines %s', lines)
log.debug(u'render_lines - Start')
bbox=self._render_lines_unaligned(lines, False) # Main font
if footer_lines is not None:
@ -263,7 +270,7 @@ class Renderer:
if footer_lines is not None:
bbox=self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) )
log.debug(u'render_lines- Finish')
return bbox
def _render_lines_unaligned(self, lines, footer, tlcorner=(0,0)):
@ -274,7 +281,7 @@ class Renderer:
than a screenful (eg. by using split_set_of_lines)
Returns the bounding box of the text as QRect"""
log.debug(u'render lines unaligned %s', lines)
log.debug(u'render lines unaligned Start')
x, y=tlcorner
brx=x
bry=y
@ -291,8 +298,7 @@ class Renderer:
p.setPen(QtGui.QPen(QtGui.QColor(0,0,255)))
p.drawRect(retval)
p.end()
log.debug(u'render lines unaligned Finish')
return retval
def _render_single_line(self, line, footer, tlcorner=(0,0)):
@ -394,6 +400,7 @@ class Renderer:
p.end()
brcorner=(rightextent,y)
log.debug(u'Render single line Finish')
return brcorner
# xxx this is what to override for an SDL version

View File

@ -18,12 +18,31 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
"""
import logging
import time
import os, os.path
import sys
from datetime import *
from PyQt4 import QtGui, QtCore, Qt
from renderer import Renderer
import sys
import linecache
def traceit(frame, event, arg):
if event == "line":
lineno = frame.f_lineno
filename = frame.f_globals["__file__"]
if (filename.endswith(".pyc") or
filename.endswith(".pyo")):
filename = filename[:-1]
name = frame.f_globals["__name__"]
line = linecache.getline(filename, lineno)
if name.startswith("openlp"):
print "%s:%s: %s" % (name, lineno, line.rstrip())
return traceit
class RenderManager:
"""
Class to pull all Renderer interactions into one place.
@ -51,6 +70,7 @@ class RenderManager:
self.theme = self.default_theme
log.debug(u'theme is now %s', self.theme)
self.themedata = self.theme_manager.getThemeData(self.theme)
self.calculate_default(self.screen_list[self.current_display]['size'])
self.renderer.set_theme(self.themedata)
self.build_text_rectangle(self.themedata)
@ -74,7 +94,7 @@ class RenderManager:
self.renderer.set_text_rectangle(main_rect,footer_rect)
def generate_preview(self, themedata):
log.debug(u'generate preview ')
log.debug(u'generate preview')
self.calculate_default(QtCore.QSize(800,600))
self.renderer.set_theme(themedata)
self.build_text_rectangle(themedata)
@ -102,20 +122,23 @@ class RenderManager:
def generate_slide(self,main_text, footer_text):
log.debug(u'generate slide')
#sys.settrace(traceit)
self.calculate_default(self.screen_list[self.current_display]['size'])
bef = datetime.now()
frame = QtGui.QPixmap(self.width, self.height)
aft = datetime.now()
print "framebuild time", bef, aft, aft-bef
self.renderer.set_paint_dest(frame)
answer=self.renderer.render_lines(main_text, footer_text)
#sys.settrace()
return frame
def calculate_default(self, screen):
log.debug(u'calculate default %s' , screen)
self.width = screen.width()
self.height = screen.height()
if self.width > 1024:
self.width = 1024
if self.height > 768:
self.height = 768
log.debug(u'calculate default %d,%d' , self.width, self.height)
self.footer_start = int(self.height*0.95) # 95% is start of footer

View File

@ -76,7 +76,7 @@ class ServiceItem():
if len(self.frames) == 0 :
for slide in self.raw_slides:
formated = self.render_manager.format_slide(slide, False)
frame = self.render_manager.generate_slide(slide, self.raw_footer)
frame = self.render_manager.generate_slide(formated, self.raw_footer)
self.frames.append({u'formatted': formated, u'image': frame})

View File

@ -31,81 +31,81 @@ from openlp.core.lib import RenderManager
from openlp.core import translate
from openlp.core.lib import Event, EventType, EventManager
class ServiceData(QtCore.QAbstractItemModel):
"""
Tree of items for an order of service.
Includes methods for reading and writing the contents to an OOS file
Root contains a list of ServiceItems
"""
global log
log=logging.getLogger(u'ServiceData')
def __init__(self):
QtCore.QAbstractItemModel.__init__(self)
self.items=[]
log.info("Starting")
def clearItems(self):
self.items = []
def columnCount(self, parent=None):
return 1; # always only a single column (for now)
def rowCount(self, parent=None):
return len(self.items)
def insertRow(self, row, service_item):
self.beginInsertRows(QtCore.QModelIndex(),row,row)
log.info("insert row %s:%s" % (row,service_item))
self.items.insert(row, service_item)
log.info("Items: %s" % self.items)
self.endInsertRows()
def removeRow(self, row):
self.beginRemoveRows(QtCore.QModelIndex(), row,row)
self.items.pop(row)
self.endRemoveRows()
def addRow(self, service_item):
self.insertRow(len(self.items), service_item)
def index(self, row, col, parent = QtCore.QModelIndex()):
return self.createIndex(row,col)
def parent(self, index=QtCore.QModelIndex()):
return QtCore.QModelIndex() # no children as yet
def data(self, index, role):
"""
Called by the service manager to draw us in the service window
"""
log.debug(u'data %s %d', index, role)
row = index.row()
if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
return QtCore.QVariant()
item = self.items[row]
if role == QtCore.Qt.DisplayRole:
retval= item.title + u':' + item.shortname
elif role == QtCore.Qt.DecorationRole:
retval = item.iconic_representation
elif role == QtCore.Qt.ToolTipRole:
retval = None
else:
retval = None
if retval == None:
retval = QtCore.QVariant()
# log.info("Returning"+ str(retval))
if type(retval) is not type(QtCore.QVariant):
return QtCore.QVariant(retval)
else:
return retval
def __iter__(self):
for i in self.items:
yield i
def item(self, row):
log.info("Get Item:%d -> %s" %(row, str(self.items)))
return self.items[row]
#class ServiceData(QtCore.QAbstractItemModel):
# """
# Tree of items for an order of service.
# Includes methods for reading and writing the contents to an OOS file
# Root contains a list of ServiceItems
# """
# global log
# log=logging.getLogger(u'ServiceData')
# def __init__(self):
# QtCore.QAbstractItemModel.__init__(self)
# self.items=[]
# log.info("Starting")
#
# def clearItems(self):
# self.items = []
#
# def columnCount(self, parent=None):
# return 1; # always only a single column (for now)
#
# def rowCount(self, parent=None):
# return len(self.items)
#
# def insertRow(self, row, service_item):
# self.beginInsertRows(QtCore.QModelIndex(),row,row)
# log.info("insert row %s:%s" % (row,service_item))
# self.items.insert(row, service_item)
# log.info("Items: %s" % self.items)
# self.endInsertRows()
#
# def removeRow(self, row):
# self.beginRemoveRows(QtCore.QModelIndex(), row,row)
# self.items.pop(row)
# self.endRemoveRows()
#
# def addRow(self, service_item):
# self.insertRow(len(self.items), service_item)
#
# def index(self, row, col, parent = QtCore.QModelIndex()):
# return self.createIndex(row,col)
#
# def parent(self, index=QtCore.QModelIndex()):
# return QtCore.QModelIndex() # no children as yet
#
# def data(self, index, role):
# """
# Called by the service manager to draw us in the service window
# """
# log.debug(u'data %s %d', index, role)
# row = index.row()
# if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
# return QtCore.QVariant()
# item = self.items[row]
# if role == QtCore.Qt.DisplayRole:
# retval= item.title + u':' + item.shortname
# elif role == QtCore.Qt.DecorationRole:
# retval = item.iconic_representation
# elif role == QtCore.Qt.ToolTipRole:
# retval = None
# else:
# retval = None
# if retval == None:
# retval = QtCore.QVariant()
## log.info("Returning"+ str(retval))
# if type(retval) is not type(QtCore.QVariant):
# return QtCore.QVariant(retval)
# else:
# return retval
#
# def __iter__(self):
# for i in self.items:
# yield i
#
# def item(self, row):
# log.info("Get Item:%d -> %s" %(row, str(self.items)))
# return self.items[row]
class ServiceManager(QtGui.QWidget):

View File

@ -41,7 +41,7 @@ class SlideData(QtCore.QAbstractListModel):
self.maximagewidth=self.rowheight*16/9.0;
log.info(u'Starting')
def clearItems(self):
def clear(self):
self.items=[]
def columnCount(self, parent):
@ -50,12 +50,12 @@ class SlideData(QtCore.QAbstractListModel):
def rowCount(self, parent=None):
return len(self.items)
def insertRow(self, row, frame):
def insertRow(self, row, frame, framenumber):
self.beginInsertRows(QtCore.QModelIndex(),row,row)
log.info(u'insert row %d' % row)
# create a preview image
frame1 = frame.scaled(QtCore.QSize(350,260))
self.items.insert(row,(frame1))
frame1 = frame.scaled(QtCore.QSize(350,260), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
self.items.insert(row,(frame1, framenumber))
log.info(u'Items: %s' % self.items)
self.endInsertRows()
@ -64,8 +64,8 @@ class SlideData(QtCore.QAbstractListModel):
self.items.pop(row)
self.endRemoveRows()
def addRow(self, frame):
self.insertRow(len(self.items), frame)
def addRow(self, frame, framenumber):
self.insertRow(len(self.items), frame, framenumber)
def data(self, index, role):
row=index.row()
@ -74,7 +74,7 @@ class SlideData(QtCore.QAbstractListModel):
# if role==Qt.DisplayRole:
# retval= self.items[row][1]
if role == QtCore.Qt.DecorationRole:
retval= self.items[row]#[0]
retval= self.items[row][0]
else:
retval= QtCore.QVariant()
# log.info("Returning"+ str(retval))
@ -120,9 +120,11 @@ class SlideController(QtGui.QWidget):
self.Controller.setWidgetResizable(True)
self.PreviewListView = QtGui.QListView(self.Splitter)
self.PreviewListView.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged)
self.PreviewListView.setAlternatingRowColors(True)
self.PreviewListData = SlideData()
self.PreviewListView.setModel(self.PreviewListData)
self.PreviewListView.setSelectionRectVisible(True)
self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536))
self.Controller.setWidget(self.PreviewListView)
@ -144,7 +146,7 @@ class SlideController(QtGui.QWidget):
self.Toolbar.addToolbarButton(u'Last Slide', u':/slides/slide_last.png',
translate(u'SlideController', u'Move to last'), self.onSlideSelectedLast)
self.Toolbar.addSeparator()
self.Toolbar.addToolbarButton(u'Close Sscreen', u':/slides/slide_close.png',
self.Toolbar.addToolbarButton(u'Close Screen', u':/slides/slide_close.png',
translate(u'SlideController', u'Close Screen'), self.onBlankScreen)
self.Toolbar.setSizePolicy(sizeToolbarPolicy)
@ -164,6 +166,13 @@ class SlideController(QtGui.QWidget):
QtCore.QObject.connect(self.PreviewListView,
QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
QtCore.QObject.connect(self.PreviewListView,
QtCore.SIGNAL(u'clicked(QListViewItem)'), self.onCurrentItemChanged)
def onCurrentItemChanged(self, current, previous):
print u'Method slideControllerList currentItemChanged called', current, previous
def onSlideSelectedFirst(self):
row = self.PreviewListData.createIndex(0, 0)
@ -184,7 +193,6 @@ class SlideController(QtGui.QWidget):
self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
self.onSlideSelected(row)
def onSlideSelectedPrevious(self):
indexes = self.PreviewListView.selectedIndexes()
rowNumber = 0
@ -212,17 +220,21 @@ class SlideController(QtGui.QWidget):
self.previewFrame(frame)
def previewFrame(self, frame):
self.SlidePreview.setPixmap(frame)
self.SlidePreview.setPixmap(frame[0])
if self.isLive:
self.mainDisplay.frameView(frame)
no = frame[1]
LiveFrame = self.serviceitem.frames[no][u'image']
self.mainDisplay.frameView(LiveFrame)
def addServiceItem(self, serviceitem):
log.debug(u'addServiceItem')
self.serviceitem = serviceitem
self.serviceitem.render()
self.PreviewListData.clearItems()
self.PreviewListData.clear()
framenumber = 0
for frame in self.serviceitem.frames:
self.PreviewListData.addRow(frame)
self.PreviewListData.addRow(frame[u'image'], framenumber)
framenumber += 1
row = self.PreviewListData.createIndex(0, 0)
if row.isValid():

View File

@ -72,7 +72,7 @@ class ThemeData(QAbstractListModel):
preview = QPixmap(str(filename))
width = self.maximagewidth
height = self.rowheight
preview = preview.scaled(width, height, Qt.KeepAspectRatio)
preview = preview.scaled(width, height, Qt.KeepAspectRatio, Qt.SmoothTransformation)
realwidth = preview.width()
realheight = preview.height()
# and move it to the centre of the preview space

View File

@ -18,6 +18,6 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
"""
from imageplugin import ImagePlugin
#from imageplugin import ImagePlugin
#from imageserviceitem import ImageServiceItem

View File

@ -29,7 +29,7 @@ class ListWithPreviews(QAbstractListModel):
if os.path.exists(filename):
preview = QPixmap(str(filename))
w=self.maximagewidth;h=self.rowheight
preview = preview.scaled(w,h, Qt.KeepAspectRatio)
preview = preview.scaled(w,h, Qt.KeepAspectRatio, Qt.SmoothTransformation)
realw=preview.width(); realh=preview.height()
# and move it to the centre of the preview space
p=QPixmap(w,h)