forked from openlp/openlp
Remove logging for Renderer to speed it up
Clean up Renderer Minor change to BibleMediaitem
This commit is contained in:
parent
2b16aacc6e
commit
47884bc340
@ -20,22 +20,14 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
import logging
|
import logging
|
||||||
import os, os.path
|
import os, os.path
|
||||||
import sys
|
import sys
|
||||||
|
#from copy import copy
|
||||||
|
|
||||||
from datetime import *
|
|
||||||
from PyQt4 import QtGui, QtCore, Qt
|
from PyQt4 import QtGui, QtCore, Qt
|
||||||
|
|
||||||
from copy import copy
|
|
||||||
|
|
||||||
class Renderer:
|
class Renderer:
|
||||||
"""
|
"""
|
||||||
All the functions for rendering a set of words onto a Device Context
|
Genarates a pixmap image of a array of text. The Text is formatted to
|
||||||
|
make sure it fits on the screen and if not extra frames a generated.
|
||||||
How to use:
|
|
||||||
set the words to be displayed with a call to format_slide() - this returns an array of screenfuls of data
|
|
||||||
set a theme (if you need) with set_theme
|
|
||||||
tell it which DC to render to with set_DC()
|
|
||||||
set the borders of where you want the text (if not the whole DC) with set_text_rectangle()
|
|
||||||
tell it to render a particular screenfull with render_screen(n)
|
|
||||||
"""
|
"""
|
||||||
global log
|
global log
|
||||||
log = logging.getLogger(u'Renderer')
|
log = logging.getLogger(u'Renderer')
|
||||||
@ -98,7 +90,7 @@ class Renderer:
|
|||||||
"""
|
"""
|
||||||
if preview == True:
|
if preview == True:
|
||||||
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:
|
||||||
self.scale_bg_image()
|
self.scale_bg_image()
|
||||||
@ -109,10 +101,10 @@ 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 ##################"
|
#print "########## Format Slide ##################"
|
||||||
log.debug(u'format_slide %s', words)
|
log.debug(u'format_slide %s', words)
|
||||||
verses = []
|
verses = []
|
||||||
words = words.replace("\r\n", "\n")
|
words = words.replace(u'\r\n', u'\n')
|
||||||
verses_text = words.split(u'\n\n')
|
verses_text = words.split(u'\n\n')
|
||||||
text = []
|
text = []
|
||||||
for verse in verses_text:
|
for verse in verses_text:
|
||||||
@ -120,8 +112,8 @@ 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
|
#print "split text ", split_text
|
||||||
print "text ", text
|
#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):
|
||||||
@ -147,7 +139,6 @@ class Renderer:
|
|||||||
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):
|
||||||
@ -158,7 +149,6 @@ 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 ', self._theme.background_type)
|
||||||
bef = datetime.now()
|
|
||||||
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':
|
||||||
@ -193,9 +183,6 @@ class Renderer:
|
|||||||
else:
|
else:
|
||||||
painter.fillRect(self._frame.rect(), QtGui.QColor(u'#000000'))
|
painter.fillRect(self._frame.rect(), QtGui.QColor(u'#000000'))
|
||||||
painter.end()
|
painter.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):
|
def _split_set_of_lines(self, lines, footer):
|
||||||
"""
|
"""
|
||||||
@ -212,16 +199,11 @@ class Renderer:
|
|||||||
#print "bboxes ", bboxes
|
#print "bboxes ", bboxes
|
||||||
numlines = len(lines)
|
numlines = len(lines)
|
||||||
bottom = self._rect.bottom()
|
bottom = self._rect.bottom()
|
||||||
count = 0
|
|
||||||
for ratio in (numlines, numlines/2, numlines/3, numlines/4):
|
for ratio in (numlines, numlines/2, numlines/3, numlines/4):
|
||||||
good = 1
|
good = 1
|
||||||
startline = 0
|
startline = 0
|
||||||
endline = startline + ratio
|
endline = startline + ratio
|
||||||
while (endline <= numlines and endline != 0):
|
while (endline <= numlines and endline != 0):
|
||||||
count += 1
|
|
||||||
if count > 100:
|
|
||||||
#print "busted"
|
|
||||||
break
|
|
||||||
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
|
#print by, startline, endline, x, y, bottom
|
||||||
@ -278,7 +260,7 @@ class Renderer:
|
|||||||
elif int(self._theme.display_verticalAlign) == 1: # centre align
|
elif int(self._theme.display_verticalAlign) == 1: # centre align
|
||||||
y = rect.top() + (rect.height() - bbox.height()) / 2
|
y = rect.top() + (rect.height() - bbox.height()) / 2
|
||||||
else:
|
else:
|
||||||
assert(0 , u'Invalid value for theme.VerticalAlign:%s' % self._theme.display_verticalAlign)
|
log.error(u'Invalid value for theme.VerticalAlign:%s' % self._theme.display_verticalAlign)
|
||||||
return x, y
|
return x, y
|
||||||
|
|
||||||
def _render_lines_unaligned(self, lines, footer, tlcorner=(0,0)):
|
def _render_lines_unaligned(self, lines, footer, tlcorner=(0,0)):
|
||||||
@ -306,7 +288,6 @@ class Renderer:
|
|||||||
painter.setPen(QtGui.QPen(QtGui.QColor(0,0,255)))
|
painter.setPen(QtGui.QPen(QtGui.QColor(0,0,255)))
|
||||||
painter.drawRect(retval)
|
painter.drawRect(retval)
|
||||||
painter.end()
|
painter.end()
|
||||||
log.debug(u'render lines unaligned Finish')
|
|
||||||
return retval
|
return retval
|
||||||
|
|
||||||
def _render_and_wrap_single_line(self, line, footer, tlcorner=(0,0)):
|
def _render_and_wrap_single_line(self, line, footer, tlcorner=(0,0)):
|
||||||
@ -317,7 +298,7 @@ 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))
|
#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
|
||||||
@ -342,7 +323,8 @@ class Renderer:
|
|||||||
startx = x
|
startx = x
|
||||||
starty = y
|
starty = y
|
||||||
rightextent = None
|
rightextent = None
|
||||||
if footer: # dont allow alignment messing with footers
|
# dont allow alignment messing with footers
|
||||||
|
if footer:
|
||||||
align = 0
|
align = 0
|
||||||
else:
|
else:
|
||||||
align = int(self._theme .display_horizontalAlign)
|
align = int(self._theme .display_horizontalAlign)
|
||||||
@ -354,42 +336,47 @@ class Renderer:
|
|||||||
w += self._shadow_offset
|
w += self._shadow_offset
|
||||||
h += self._shadow_offset
|
h += self._shadow_offset
|
||||||
if self._theme.display_outline:
|
if self._theme.display_outline:
|
||||||
w += 2*self._outline_offset # pixels either side
|
# pixels either side
|
||||||
h += 2*self._outline_offset # pixels top/bottom
|
w += 2 * self._outline_offset
|
||||||
|
# pixels top/bottom
|
||||||
|
h += 2 * self._outline_offset
|
||||||
if align == 0: # left align
|
if align == 0: # left align
|
||||||
rightextent = x + w
|
rightextent = x + w
|
||||||
if self._theme.display_wrapStyle == 1 and linenum != 0: # shift right from last line's rh edge
|
# shift right from last line's rh edge
|
||||||
|
if self._theme.display_wrapStyle == 1 and linenum != 0:
|
||||||
rightextent = self._first_line_right_extent + self._right_margin
|
rightextent = self._first_line_right_extent + self._right_margin
|
||||||
if rightextent > maxx:
|
if rightextent > maxx:
|
||||||
rightextent = maxx
|
rightextent = maxx
|
||||||
x = rightextent - w
|
x = rightextent - w
|
||||||
elif align == 1: # right align
|
# right align
|
||||||
|
elif align == 1:
|
||||||
rightextent = maxx
|
rightextent = maxx
|
||||||
x = maxx - w
|
x = maxx - w
|
||||||
elif align == 2: # centre
|
# centre
|
||||||
|
elif align == 2:
|
||||||
x = (maxx - w) / 2;
|
x = (maxx - w) / 2;
|
||||||
rightextent = x + w
|
rightextent = x + w
|
||||||
# now draw the text, and any outlines/shadows
|
# now draw the text, and any outlines/shadows
|
||||||
if self._theme.display_shadow:
|
if self._theme.display_shadow:
|
||||||
self._get_extent_and_render(line, footer,tlcorner=(x+self._shadow_offset,y+self._shadow_offset),
|
self._get_extent_and_render(line, footer, tlcorner=(x+self._shadow_offset,y+self._shadow_offset),
|
||||||
draw=True, color = self._theme.display_shadow_color)
|
draw=True, color = self._theme.display_shadow_color)
|
||||||
if self._theme.display_outline:
|
if self._theme.display_outline:
|
||||||
self._get_extent_and_render(line, footer,(x+self._outline_offset,y), draw=True,
|
self._get_extent_and_render(line, footer, (x+self._outline_offset,y), draw=True,
|
||||||
color = self._theme.display_outline_color)
|
color = self._theme.display_outline_color)
|
||||||
self._get_extent_and_render(line, footer,(x, y+self._outline_offset), draw=True,
|
self._get_extent_and_render(line, footer, (x, y+self._outline_offset), draw=True,
|
||||||
color = self._theme.display_outline_color)
|
color = self._theme.display_outline_color)
|
||||||
self._get_extent_and_render(line, footer,(x, y-self._outline_offset), draw=True,
|
self._get_extent_and_render(line, footer, (x, y-self._outline_offset), draw=True,
|
||||||
color = self._theme.display_outline_color)
|
color = self._theme.display_outline_color)
|
||||||
self._get_extent_and_render(line, footer,(x-self._outline_offset,y), draw=True,
|
self._get_extent_and_render(line, footer, (x-self._outline_offset,y), draw=True,
|
||||||
color = self._theme.display_outline_color)
|
color = self._theme.display_outline_color)
|
||||||
if self._outline_offset > 1:
|
if self._outline_offset > 1:
|
||||||
self._get_extent_and_render(line, footer,(x+self._outline_offset,y+self._outline_offset), draw=True,
|
self._get_extent_and_render(line, footer, (x+self._outline_offset,y+self._outline_offset), draw=True,
|
||||||
color = self._theme.display_outline_color)
|
color = self._theme.display_outline_color)
|
||||||
self._get_extent_and_render(line, footer,(x-self._outline_offset,y+self._outline_offset), draw=True,
|
self._get_extent_and_render(line, footer, (x-self._outline_offset,y+self._outline_offset), draw=True,
|
||||||
color = self._theme.display_outline_color)
|
color = self._theme.display_outline_color)
|
||||||
self._get_extent_and_render(line, footer,(x+self._outline_offset,y-self._outline_offset), draw=True,
|
self._get_extent_and_render(line, footer, (x+self._outline_offset,y-self._outline_offset), draw=True,
|
||||||
color = self._theme.display_outline_color)
|
color = self._theme.display_outline_color)
|
||||||
self._get_extent_and_render(line, footer,(x-self._outline_offset,y-self._outline_offset), draw=True,
|
self._get_extent_and_render(line, footer, (x-self._outline_offset,y-self._outline_offset), draw=True,
|
||||||
color = self._theme.display_outline_color)
|
color = self._theme.display_outline_color)
|
||||||
self._get_extent_and_render(line, footer,tlcorner=(x, y), draw=True)
|
self._get_extent_and_render(line, footer,tlcorner=(x, y), draw=True)
|
||||||
y += h
|
y += h
|
||||||
@ -403,7 +390,6 @@ class Renderer:
|
|||||||
painter.drawRect(startx , starty , rightextent-startx , y-starty)
|
painter.drawRect(startx , starty , rightextent-startx , y-starty)
|
||||||
painter.end()
|
painter.end()
|
||||||
brcorner = (rightextent , y)
|
brcorner = (rightextent , y)
|
||||||
log.debug(u'Render single line Finish')
|
|
||||||
return brcorner
|
return brcorner
|
||||||
|
|
||||||
# xxx this is what to override for an SDL version
|
# xxx this is what to override for an SDL version
|
||||||
@ -454,14 +440,7 @@ class Renderer:
|
|||||||
Debugging method to allow images to be viewed
|
Debugging method to allow images to be viewed
|
||||||
"""
|
"""
|
||||||
im = image.toImage()
|
im = image.toImage()
|
||||||
im.save("renderer.png", "png")
|
im.save(u'renderer.png', u'png')
|
||||||
if image2 is not None:
|
if image2 is not None:
|
||||||
im = image2.toImage()
|
im = image2.toImage()
|
||||||
im.save("renderer2.png", "png")
|
im.save(u'renderer2.png', u'png')
|
||||||
|
|
||||||
# def render_screen(self, screennum):
|
|
||||||
# log.debug(u'render screen\n %s %s ', screennum, self.words[screennum])
|
|
||||||
# t = 0.0
|
|
||||||
# words = self.words[screennum]
|
|
||||||
# retval = self._render_lines(words)
|
|
||||||
# return retval
|
|
||||||
|
@ -33,9 +33,9 @@ class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
|
|||||||
global log
|
global log
|
||||||
log=logging.getLogger(u'BibleImportForm')
|
log=logging.getLogger(u'BibleImportForm')
|
||||||
log.info(u'BibleImportForm loaded')
|
log.info(u'BibleImportForm loaded')
|
||||||
'''
|
"""
|
||||||
Class documentation goes here.
|
Class documentation goes here.
|
||||||
'''
|
"""
|
||||||
def __init__(self, config, biblemanager , bibleplugin, parent = None):
|
def __init__(self, config, biblemanager , bibleplugin, parent = None):
|
||||||
'''
|
'''
|
||||||
Constructor
|
Constructor
|
||||||
|
@ -226,7 +226,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
QtCore.QObject.connect(self.QuickSearchButton,
|
QtCore.QObject.connect(self.QuickSearchButton,
|
||||||
QtCore.SIGNAL(u'pressed()'), self.onQuickSearchButton)
|
QtCore.SIGNAL(u'pressed()'), self.onQuickSearchButton)
|
||||||
QtCore.QObject.connect(self.BibleListView,
|
QtCore.QObject.connect(self.BibleListView,
|
||||||
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onRowSelected)
|
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onBiblePreviewClick())
|
||||||
# Context Menus
|
# Context Menus
|
||||||
self.BibleListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
|
self.BibleListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
|
||||||
self.BibleListView.addAction(self.contextMenuAction(
|
self.BibleListView.addAction(self.contextMenuAction(
|
||||||
@ -239,7 +239,6 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
self.BibleListView, u':/system/system_add.png',
|
self.BibleListView, u':/system/system_add.png',
|
||||||
translate(u'BibleMediaItem',u'&Add to Service'), self.onBibleAddClick))
|
translate(u'BibleMediaItem',u'&Add to Service'), self.onBibleAddClick))
|
||||||
|
|
||||||
|
|
||||||
def retranslateUi(self):
|
def retranslateUi(self):
|
||||||
log.debug(u'retranslateUi')
|
log.debug(u'retranslateUi')
|
||||||
self.QuickVersionLabel.setText(translate(u'BibleMediaItem', u'Version:'))
|
self.QuickVersionLabel.setText(translate(u'BibleMediaItem', u'Version:'))
|
||||||
@ -262,9 +261,6 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
self.ClearAdvancedSearchComboBox.addItem(translate(u'BibleMediaItem', u'Clear'))
|
self.ClearAdvancedSearchComboBox.addItem(translate(u'BibleMediaItem', u'Clear'))
|
||||||
self.ClearAdvancedSearchComboBox.addItem(translate(u'BibleMediaItem', u'Keep'))
|
self.ClearAdvancedSearchComboBox.addItem(translate(u'BibleMediaItem', u'Keep'))
|
||||||
|
|
||||||
def onRowSelected(self, row):
|
|
||||||
self.onBiblePreviewClick()
|
|
||||||
|
|
||||||
def initialise(self):
|
def initialise(self):
|
||||||
log.debug(u'initialise')
|
log.debug(u'initialise')
|
||||||
self.loadBibles()
|
self.loadBibles()
|
||||||
|
Loading…
Reference in New Issue
Block a user