forked from openlp/openlp
Changes to improve performance.
This commit is contained in:
parent
ade5671319
commit
7a05a944ef
|
@ -46,6 +46,7 @@ class Renderer:
|
||||||
self._frame = None
|
self._frame = None
|
||||||
self._bg_frame = None
|
self._bg_frame = None
|
||||||
self.bg_image = None
|
self.bg_image = None
|
||||||
|
self._bg_frame_small = None
|
||||||
|
|
||||||
def set_debug(self, debug):
|
def set_debug(self, debug):
|
||||||
self._debug=debug
|
self._debug=debug
|
||||||
|
@ -57,7 +58,9 @@ class Renderer:
|
||||||
log.debug(u'set theme')
|
log.debug(u'set theme')
|
||||||
self._theme = theme
|
self._theme = theme
|
||||||
self._bg_frame = None
|
self._bg_frame = None
|
||||||
|
self.bg_image = None
|
||||||
self.theme_name = theme.theme_name
|
self.theme_name = theme.theme_name
|
||||||
|
self._set_theme_font()
|
||||||
if theme.background_type == u'image':
|
if theme.background_type == u'image':
|
||||||
if theme.background_filename is not None:
|
if theme.background_filename is not None:
|
||||||
self.set_bg_image(theme.background_filename)
|
self.set_bg_image(theme.background_filename)
|
||||||
|
@ -92,7 +95,7 @@ class Renderer:
|
||||||
self._bg_frame = None
|
self._bg_frame = None
|
||||||
log.debug(u'set frame dest (frame) w %d h %d', frame_width, frame_height)
|
log.debug(u'set frame dest (frame) w %d h %d', frame_width, frame_height)
|
||||||
self._frame = QtGui.QPixmap(frame_width, frame_height)
|
self._frame = QtGui.QPixmap(frame_width, frame_height)
|
||||||
if self._bg_image_filename is not None:
|
if self._bg_image_filename is not None and self.bg_image is None:
|
||||||
self.scale_bg_image()
|
self.scale_bg_image()
|
||||||
if self._bg_frame is None:
|
if self._bg_frame is None:
|
||||||
self._generate_background_frame()
|
self._generate_background_frame()
|
||||||
|
@ -101,8 +104,7 @@ class Renderer:
|
||||||
"""
|
"""
|
||||||
External API to sort out the text to pe placed on the frame
|
External API to sort out the text to pe placed on the frame
|
||||||
"""
|
"""
|
||||||
#print "########## Format Slide ##################"
|
log.debug(u'format_slide - Start')
|
||||||
log.debug(u'format_slide %s', words)
|
|
||||||
verses = []
|
verses = []
|
||||||
words = words.replace(u'\r\n', u'\n')
|
words = words.replace(u'\r\n', u'\n')
|
||||||
verses_text = words.split(u'\n\n')
|
verses_text = words.split(u'\n\n')
|
||||||
|
@ -112,8 +114,7 @@ class Renderer:
|
||||||
for line in lines:
|
for line in lines:
|
||||||
text.append(line)
|
text.append(line)
|
||||||
split_text = self._split_set_of_lines(text, False)
|
split_text = self._split_set_of_lines(text, False)
|
||||||
#print "split text ", split_text
|
log.debug(u'format_slide - End')
|
||||||
#print "text ", text
|
|
||||||
return split_text
|
return split_text
|
||||||
|
|
||||||
def set_text_rectangle(self, rect_main, rect_footer):
|
def set_text_rectangle(self, rect_main, rect_footer):
|
||||||
|
@ -133,12 +134,14 @@ class Renderer:
|
||||||
bbox = self._render_lines_unaligned(lines, False)
|
bbox = self._render_lines_unaligned(lines, False)
|
||||||
if footer_lines is not None:
|
if footer_lines is not None:
|
||||||
bbox1 = self._render_lines_unaligned(footer_lines, True)
|
bbox1 = self._render_lines_unaligned(footer_lines, True)
|
||||||
# reset the frame. first time do not worrk about what you paint on.
|
# reset the frame. first time do not worry about what you paint on.
|
||||||
self._frame = QtGui.QPixmap(self._bg_frame)
|
self._frame = QtGui.QPixmap(self._frame.width(), self._frame.height()) #(self._bg_frame)
|
||||||
|
self._frame.fill(QtCore.Qt.transparent)
|
||||||
x, y = self._correctAlignment(self._rect, bbox)
|
x, y = self._correctAlignment(self._rect, bbox)
|
||||||
bbox = self._render_lines_unaligned(lines, False, (x, y))
|
bbox = self._render_lines_unaligned(lines, False, (x, y))
|
||||||
if footer_lines is not None:
|
if footer_lines is not None:
|
||||||
bbox = self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) )
|
bbox = self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) )
|
||||||
|
log.debug(u'generate_frame_from_lines - Finish')
|
||||||
return self._frame
|
return self._frame
|
||||||
|
|
||||||
def _generate_background_frame(self):
|
def _generate_background_frame(self):
|
||||||
|
@ -148,7 +151,7 @@ class Renderer:
|
||||||
"""
|
"""
|
||||||
assert(self._theme)
|
assert(self._theme)
|
||||||
self._bg_frame = QtGui.QPixmap(self._frame.width(), self._frame.height())
|
self._bg_frame = QtGui.QPixmap(self._frame.width(), self._frame.height())
|
||||||
log.debug(u'render background %s ', self._theme.background_type)
|
log.debug(u'render background %s start', self._theme.background_type)
|
||||||
painter = QtGui.QPainter()
|
painter = QtGui.QPainter()
|
||||||
painter.begin(self._bg_frame)
|
painter.begin(self._bg_frame)
|
||||||
if self._theme.background_type == u'solid':
|
if self._theme.background_type == u'solid':
|
||||||
|
@ -177,12 +180,15 @@ class Renderer:
|
||||||
rectPath.lineTo(max_x, 0)
|
rectPath.lineTo(max_x, 0)
|
||||||
rectPath.closeSubpath()
|
rectPath.closeSubpath()
|
||||||
painter.drawPath(rectPath)
|
painter.drawPath(rectPath)
|
||||||
elif self._theme.background_type== u'image': # image
|
elif self._theme.background_type== u'image':
|
||||||
if self.bg_image is not None:
|
if self.bg_image is not None:
|
||||||
painter.drawPixmap(0 ,0 , self.bg_image)
|
painter.drawPixmap(0 ,0 , self.bg_image)
|
||||||
else:
|
else:
|
||||||
painter.fillRect(self._frame.rect(), QtGui.QColor(u'#000000'))
|
painter.fillRect(self._frame.rect(), QtGui.QColor(u'#000000'))
|
||||||
painter.end()
|
painter.end()
|
||||||
|
self._bg_frame_small = self._bg_frame.scaled(QtCore.QSize(280, 210), QtCore.Qt.KeepAspectRatio,
|
||||||
|
QtCore.Qt.SmoothTransformation)
|
||||||
|
log.debug(u'render background End')
|
||||||
|
|
||||||
def _split_set_of_lines(self, lines, footer):
|
def _split_set_of_lines(self, lines, footer):
|
||||||
"""
|
"""
|
||||||
|
@ -193,10 +199,8 @@ class Renderer:
|
||||||
Returns a list of [lists of lines], one set for each screenful
|
Returns a list of [lists of lines], one set for each screenful
|
||||||
"""
|
"""
|
||||||
bboxes = []
|
bboxes = []
|
||||||
#print "lines ", lines
|
|
||||||
for line in lines:
|
for line in lines:
|
||||||
bboxes.append(self._render_and_wrap_single_line(line, footer))
|
bboxes.append(self._render_and_wrap_single_line(line, footer))
|
||||||
#print "bboxes ", bboxes
|
|
||||||
numlines = len(lines)
|
numlines = len(lines)
|
||||||
bottom = self._rect.bottom()
|
bottom = self._rect.bottom()
|
||||||
for ratio in (numlines, numlines/2, numlines/3, numlines/4):
|
for ratio in (numlines, numlines/2, numlines/3, numlines/4):
|
||||||
|
@ -206,9 +210,7 @@ class Renderer:
|
||||||
while (endline <= numlines and endline != 0):
|
while (endline <= numlines and endline != 0):
|
||||||
by = 0
|
by = 0
|
||||||
for (x,y) in bboxes[startline:endline]:
|
for (x,y) in bboxes[startline:endline]:
|
||||||
#print by, startline, endline, x, y, bottom
|
|
||||||
by += y
|
by += y
|
||||||
#print "by ", by , bottom, startline, endline, numlines, ratio
|
|
||||||
if by > bottom:
|
if by > bottom:
|
||||||
good = 0
|
good = 0
|
||||||
break
|
break
|
||||||
|
@ -218,20 +220,17 @@ class Renderer:
|
||||||
break
|
break
|
||||||
retval = []
|
retval = []
|
||||||
numlines_per_page = ratio
|
numlines_per_page = ratio
|
||||||
#print "good ", good, ratio
|
|
||||||
if good:
|
if good:
|
||||||
c = 0
|
c = 0
|
||||||
thislines = []
|
thislines = []
|
||||||
while c < numlines:
|
while c < numlines:
|
||||||
thislines.append(lines[c])
|
thislines.append(lines[c])
|
||||||
c += 1
|
c += 1
|
||||||
#print "c ", c, len(thislines), numlines_per_page, thislines
|
|
||||||
if len(thislines) == numlines_per_page:
|
if len(thislines) == numlines_per_page:
|
||||||
retval.append(thislines)
|
retval.append(thislines)
|
||||||
thislines = []
|
thislines = []
|
||||||
if len(thislines) > 0:
|
if len(thislines) > 0:
|
||||||
retval.append(thislines)
|
retval.append(thislines)
|
||||||
#print "extra ", thislines
|
|
||||||
else:
|
else:
|
||||||
# print "Just split where you can"
|
# print "Just split where you can"
|
||||||
retval = []
|
retval = []
|
||||||
|
@ -248,7 +247,6 @@ class Renderer:
|
||||||
endline = startline
|
endline = startline
|
||||||
by = 0
|
by = 0
|
||||||
endline += 1
|
endline += 1
|
||||||
#print "retval ", retval
|
|
||||||
return retval
|
return retval
|
||||||
|
|
||||||
def _correctAlignment(self, rect, bbox):
|
def _correctAlignment(self, rect, bbox):
|
||||||
|
@ -271,7 +269,6 @@ class Renderer:
|
||||||
than a screenful (eg. by using split_set_of_lines)
|
than a screenful (eg. by using split_set_of_lines)
|
||||||
Returns the bounding box of the text as QRect
|
Returns the bounding box of the text as QRect
|
||||||
"""
|
"""
|
||||||
log.debug(u'render lines unaligned Start')
|
|
||||||
x, y = tlcorner
|
x, y = tlcorner
|
||||||
brx = x
|
brx = x
|
||||||
bry = y
|
bry = y
|
||||||
|
@ -298,7 +295,6 @@ class Renderer:
|
||||||
right-aligns the surplus words in the manner of song lyrics
|
right-aligns the surplus words in the manner of song lyrics
|
||||||
Returns the bottom-right corner (of what was rendered) as a tuple(x, y).
|
Returns the bottom-right corner (of what was rendered) as a tuple(x, y).
|
||||||
"""
|
"""
|
||||||
#log.debug(u'Render single line %s @ %s '%( line, tlcorner))
|
|
||||||
x, y = tlcorner
|
x, y = tlcorner
|
||||||
# We draw the text to see how big it is and then iterate to make it fit
|
# We draw the text to see how big it is and then iterate to make it fit
|
||||||
# when we line wrap we do in in the "lyrics" style, so the second line is
|
# when we line wrap we do in in the "lyrics" style, so the second line is
|
||||||
|
@ -392,7 +388,18 @@ class Renderer:
|
||||||
brcorner = (rightextent , y)
|
brcorner = (rightextent , y)
|
||||||
return brcorner
|
return brcorner
|
||||||
|
|
||||||
# xxx this is what to override for an SDL version
|
def _set_theme_font(self):
|
||||||
|
self.footerFont = QtGui.QFont(self._theme.font_footer_name,
|
||||||
|
int(self._theme.font_footer_proportion), # size
|
||||||
|
QtGui.QFont.Normal, # weight
|
||||||
|
0)# italic
|
||||||
|
self.footerFont.setPixelSize(int(self._theme.font_footer_proportion))
|
||||||
|
self.mainFont = QtGui.QFont(self._theme.font_main_name,
|
||||||
|
int(self._theme.font_main_proportion), # size
|
||||||
|
QtGui.QFont.Normal, # weight
|
||||||
|
0)# italic
|
||||||
|
self.mainFont.setPixelSize(int(self._theme.font_main_proportion))
|
||||||
|
|
||||||
def _get_extent_and_render(self, line, footer, tlcorner=(0,0), draw=False, color=None):
|
def _get_extent_and_render(self, line, footer, tlcorner=(0,0), draw=False, color=None):
|
||||||
"""
|
"""
|
||||||
Find bounding box of text - as render_single_line.
|
Find bounding box of text - as render_single_line.
|
||||||
|
@ -400,23 +407,14 @@ class Renderer:
|
||||||
return width and height of text as a tuple (w,h)
|
return width and height of text as a tuple (w,h)
|
||||||
"""
|
"""
|
||||||
# setup defaults
|
# setup defaults
|
||||||
#log.debug(u'_get_extent_and_render %s %s %s ', [line], tlcorner, draw)
|
|
||||||
painter = QtGui.QPainter()
|
painter = QtGui.QPainter()
|
||||||
painter.begin(self._frame)
|
painter.begin(self._frame)
|
||||||
# 'twould be more efficient to set this once when theme changes
|
# 'twould be more efficient to set this once when theme changes
|
||||||
# or p changes
|
# or p changes
|
||||||
if footer :
|
if footer :
|
||||||
font = QtGui.QFont(self._theme.font_footer_name,
|
font = self.footerFont
|
||||||
int(self._theme.font_footer_proportion), # size
|
|
||||||
QtGui.QFont.Normal, # weight
|
|
||||||
0)# italic
|
|
||||||
font.setPixelSize(int(self._theme.font_footer_proportion))
|
|
||||||
else:
|
else:
|
||||||
font = QtGui.QFont(self._theme.font_main_name,
|
font = self.mainFont
|
||||||
int(self._theme.font_main_proportion), # size
|
|
||||||
QtGui.QFont.Normal, # weight
|
|
||||||
0)# italic
|
|
||||||
font.setPixelSize(int(self._theme.font_main_proportion))
|
|
||||||
painter.setFont(font)
|
painter.setFont(font)
|
||||||
if color == None:
|
if color == None:
|
||||||
if footer:
|
if footer:
|
||||||
|
|
|
@ -70,6 +70,7 @@ class RenderManager:
|
||||||
"""
|
"""
|
||||||
Updates the render manager's information about the current screen.
|
Updates the render manager's information about the current screen.
|
||||||
"""
|
"""
|
||||||
|
log.debug(u'Update Display')
|
||||||
if self.current_display != screen_number:
|
if self.current_display != screen_number:
|
||||||
self.current_display = screen_number
|
self.current_display = screen_number
|
||||||
self.calculate_default(self.screen_list[self.current_display]['size'])
|
self.calculate_default(self.screen_list[self.current_display]['size'])
|
||||||
|
@ -100,7 +101,6 @@ class RenderManager:
|
||||||
self.theme = self.service_theme
|
self.theme = self.service_theme
|
||||||
else:
|
else:
|
||||||
self.theme = self.global_theme
|
self.theme = self.global_theme
|
||||||
|
|
||||||
if self.theme is not self.renderer.theme_name:
|
if self.theme is not self.renderer.theme_name:
|
||||||
log.debug(u'theme is now %s', self.theme)
|
log.debug(u'theme is now %s', self.theme)
|
||||||
self.themedata = self.theme_manager.getThemeData(self.theme)
|
self.themedata = self.theme_manager.getThemeData(self.theme)
|
||||||
|
@ -112,19 +112,16 @@ class RenderManager:
|
||||||
log.debug(u'build_text_rectangle ')
|
log.debug(u'build_text_rectangle ')
|
||||||
main_rect = None
|
main_rect = None
|
||||||
footer_rect = None
|
footer_rect = None
|
||||||
|
|
||||||
if theme.font_main_override == False:
|
if theme.font_main_override == False:
|
||||||
main_rect = QtCore.QRect(10,0, self.width-1, self.height-1)
|
main_rect = QtCore.QRect(10,0, self.width-1, self.height-1)
|
||||||
else:
|
else:
|
||||||
main_rect = QtCore.QRect(int(theme.font_main_x) , int(theme.font_main_y),
|
main_rect = QtCore.QRect(int(theme.font_main_x) , int(theme.font_main_y),
|
||||||
int(theme.font_main_width)-1, int(theme.font_main_height)-1)
|
int(theme.font_main_width)-1, int(theme.font_main_height)-1)
|
||||||
|
|
||||||
if theme.font_footer_override == False:
|
if theme.font_footer_override == False:
|
||||||
footer_rect = QtCore.QRect(10,self.footer_start, self.width-1, self.height-self.footer_start)
|
footer_rect = QtCore.QRect(10,self.footer_start, self.width-1, self.height-self.footer_start)
|
||||||
else:
|
else:
|
||||||
footer_rect = QtCore.QRect(int(theme.font_footer_x),int(theme.font_footer_y),
|
footer_rect = QtCore.QRect(int(theme.font_footer_x),int(theme.font_footer_y),
|
||||||
int(theme.font_footer_width)-1, int(theme.font_footer_height)-1)
|
int(theme.font_footer_width)-1, int(theme.font_footer_height)-1)
|
||||||
|
|
||||||
self.renderer.set_text_rectangle(main_rect,footer_rect)
|
self.renderer.set_text_rectangle(main_rect,footer_rect)
|
||||||
|
|
||||||
def generate_preview(self, themedata):
|
def generate_preview(self, themedata):
|
||||||
|
@ -132,9 +129,7 @@ class RenderManager:
|
||||||
self.calculate_default(QtCore.QSize(1024, 768))
|
self.calculate_default(QtCore.QSize(1024, 768))
|
||||||
self.renderer.set_theme(themedata)
|
self.renderer.set_theme(themedata)
|
||||||
self.build_text_rectangle(themedata)
|
self.build_text_rectangle(themedata)
|
||||||
|
|
||||||
self.renderer.set_frame_dest(self.width, self.height, True)
|
self.renderer.set_frame_dest(self.width, self.height, True)
|
||||||
|
|
||||||
lines = []
|
lines = []
|
||||||
lines.append(u'Amazing Grace!')
|
lines.append(u'Amazing Grace!')
|
||||||
lines.append(u'How sweet the sound')
|
lines.append(u'How sweet the sound')
|
||||||
|
@ -165,15 +160,7 @@ class RenderManager:
|
||||||
log.debug(u'calculate default %s' , screen)
|
log.debug(u'calculate default %s' , screen)
|
||||||
self.width = screen.width()
|
self.width = screen.width()
|
||||||
self.height = screen.height()
|
self.height = screen.height()
|
||||||
|
self.width = 1024
|
||||||
|
self.height = 768
|
||||||
log.debug(u'calculate default %d,%d' , self.width, self.height)
|
log.debug(u'calculate default %d,%d' , self.width, self.height)
|
||||||
self.footer_start = int(self.height*0.90) # 90% is start of footer
|
self.footer_start = int(self.height*0.90) # 90% is start of footer
|
||||||
|
|
||||||
def snoop_Image(self, image, image2=None):
|
|
||||||
"""
|
|
||||||
Debugging method to allow images to be viewed
|
|
||||||
"""
|
|
||||||
im = image.toImage()
|
|
||||||
im.save("renderer.png", "png")
|
|
||||||
if image2 is not None:
|
|
||||||
im = image2.toImage()
|
|
||||||
im.save("renderer2.png", "png")
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ class ServiceItem():
|
||||||
else:
|
else:
|
||||||
self.RenderManager.set_override_theme(self.theme)
|
self.RenderManager.set_override_theme(self.theme)
|
||||||
log.debug(u'Formatting slides')
|
log.debug(u'Formatting slides')
|
||||||
|
self.frames = []
|
||||||
if self.service_item_type == u'text':
|
if self.service_item_type == u'text':
|
||||||
for slide in self.service_frames:
|
for slide in self.service_frames:
|
||||||
formated = self.RenderManager.format_slide(slide[u'raw_slide'])
|
formated = self.RenderManager.format_slide(slide[u'raw_slide'])
|
||||||
|
|
|
@ -184,6 +184,11 @@ class ServiceManager(QtGui.QWidget):
|
||||||
self.service_theme = self.ThemeComboBox.currentText()
|
self.service_theme = self.ThemeComboBox.currentText()
|
||||||
self.parent.RenderManager.set_service_theme(self.service_theme)
|
self.parent.RenderManager.set_service_theme(self.service_theme)
|
||||||
self.config.set_config(u'theme service theme', self.service_theme)
|
self.config.set_config(u'theme service theme', self.service_theme)
|
||||||
|
if len(self.serviceItems) > 0:
|
||||||
|
tempServiceItems = self.serviceItems
|
||||||
|
self.onNewService()
|
||||||
|
for item in tempServiceItems:
|
||||||
|
self.addServiceItem(item[u'data'])
|
||||||
|
|
||||||
def addServiceItem(self, item, expand=True):
|
def addServiceItem(self, item, expand=True):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -56,7 +56,7 @@ class SlideData(QtCore.QAbstractListModel):
|
||||||
frame1 = frame.scaled(QtCore.QSize(280, 210), QtCore.Qt.KeepAspectRatio,
|
frame1 = frame.scaled(QtCore.QSize(280, 210), QtCore.Qt.KeepAspectRatio,
|
||||||
QtCore.Qt.SmoothTransformation)
|
QtCore.Qt.SmoothTransformation)
|
||||||
self.items.insert(row, (frame1, framenumber))
|
self.items.insert(row, (frame1, framenumber))
|
||||||
log.info(u'Items: %s' % self.items)
|
log.info(u'Item loaded')
|
||||||
self.endInsertRows()
|
self.endInsertRows()
|
||||||
|
|
||||||
def removeRow(self, row):
|
def removeRow(self, row):
|
||||||
|
@ -133,6 +133,8 @@ class SlideController(QtGui.QWidget):
|
||||||
self.ControllerLayout.setMargin(0)
|
self.ControllerLayout.setMargin(0)
|
||||||
# Controller list view
|
# Controller list view
|
||||||
self.PreviewListView = QtGui.QListView(self.Controller)
|
self.PreviewListView = QtGui.QListView(self.Controller)
|
||||||
|
self.PreviewListView.setUniformItemSizes(True)
|
||||||
|
self.PreviewListView.setIconSize(QtCore.QSize(250, 190))
|
||||||
self.PreviewListData = SlideData()
|
self.PreviewListData = SlideData()
|
||||||
self.PreviewListView.isLive = self.isLive
|
self.PreviewListView.isLive = self.isLive
|
||||||
#self.PreviewListView.setFlow(1)
|
#self.PreviewListView.setFlow(1)
|
||||||
|
|
Loading…
Reference in New Issue