forked from openlp/openlp
Add Preformance Monitoring for Renderer
Fix Pixmap problems with pixelation Remove duplicate image plugin issue.
This commit is contained in:
parent
a7d1ba85ed
commit
b2d2de6ad8
@ -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')
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
@ -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
|
||||
|
@ -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})
|
||||
|
||||
|
||||
|
@ -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):
|
||||
|
@ -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():
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user