Add profiling support to lrfviewer

This commit is contained in:
Kovid Goyal 2007-09-22 23:54:40 +00:00
parent 5c369f7d99
commit 5b21df0678
2 changed files with 39 additions and 30 deletions

View File

@ -856,39 +856,40 @@ class Document(QGraphicsScene):
self.show_page(page) self.show_page(page)
def load_fonts(self, lrf): def load_fonts(self, lrf, load_substitutions=True):
font_map = {} font_map = {}
for font in lrf.font_map: for font in lrf.font_map:
fdata = QByteArray(lrf.font_map[font].data) fdata = QByteArray(lrf.font_map[font].data)
id = QFontDatabase.addApplicationFontFromData(fdata) id = QFontDatabase.addApplicationFontFromData(fdata)
font_map[font] = [str(i) for i in QFontDatabase.applicationFontFamilies(id)][0] font_map[font] = [str(i) for i in QFontDatabase.applicationFontFamilies(id)][0]
from libprs500.ebooks.lrf.fonts.liberation import LiberationMono_BoldItalic if load_substitutions:
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationMono_BoldItalic.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationMono_BoldItalic
from libprs500.ebooks.lrf.fonts.liberation import LiberationMono_Italic QFontDatabase.addApplicationFontFromData(QByteArray(LiberationMono_BoldItalic.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationMono_Italic.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationMono_Italic
from libprs500.ebooks.lrf.fonts.liberation import LiberationSerif_Bold QFontDatabase.addApplicationFontFromData(QByteArray(LiberationMono_Italic.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSerif_Bold.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationSerif_Bold
from libprs500.ebooks.lrf.fonts.liberation import LiberationSans_BoldItalic QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSerif_Bold.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSans_BoldItalic.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationSans_BoldItalic
from libprs500.ebooks.lrf.fonts.liberation import LiberationMono_Regular QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSans_BoldItalic.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationMono_Regular.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationMono_Regular
from libprs500.ebooks.lrf.fonts.liberation import LiberationSans_Italic QFontDatabase.addApplicationFontFromData(QByteArray(LiberationMono_Regular.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSans_Italic.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationSans_Italic
from libprs500.ebooks.lrf.fonts.liberation import LiberationSerif_Regular QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSans_Italic.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSerif_Regular.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationSerif_Regular
from libprs500.ebooks.lrf.fonts.liberation import LiberationSerif_Italic QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSerif_Regular.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSerif_Italic.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationSerif_Italic
from libprs500.ebooks.lrf.fonts.liberation import LiberationSans_Bold QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSerif_Italic.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSans_Bold.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationSans_Bold
from libprs500.ebooks.lrf.fonts.liberation import LiberationMono_Bold QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSans_Bold.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationMono_Bold.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationMono_Bold
from libprs500.ebooks.lrf.fonts.liberation import LiberationSerif_BoldItalic QFontDatabase.addApplicationFontFromData(QByteArray(LiberationMono_Bold.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSerif_BoldItalic.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationSerif_BoldItalic
from libprs500.ebooks.lrf.fonts.liberation import LiberationSans_Regular QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSerif_BoldItalic.font_data))
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSans_Regular.font_data)) from libprs500.ebooks.lrf.fonts.liberation import LiberationSans_Regular
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationSans_Regular.font_data))
self.font_loader = FontLoader(font_map, self.dpi) self.font_loader = FontLoader(font_map, self.dpi)
@ -916,10 +917,10 @@ class Document(QGraphicsScene):
self.chapter_map[chapter.id] = len(self.chapters)-1 self.chapter_map[chapter.id] = len(self.chapters)-1
def render(self, lrf): def render(self, lrf, load_substitutions=True):
self.dpi = lrf.device_info.dpi/10. self.dpi = lrf.device_info.dpi/10.
self.ruby_tags = dict(**lrf.ruby_tags) self.ruby_tags = dict(**lrf.ruby_tags)
self.load_fonts(lrf) self.load_fonts(lrf, load_substitutions)
self.objects = lrf.objects self.objects = lrf.objects
num_chaps = 0 num_chaps = 0
@ -931,6 +932,7 @@ class Document(QGraphicsScene):
for pt in lrf.page_trees: for pt in lrf.page_trees:
for chapter in pt: for chapter in pt:
self.render_chapter(chapter, lrf) self.render_chapter(chapter, lrf)
self.emit(SIGNAL('chapter_rendered(int)'), -1) self.emit(SIGNAL('chapter_rendered(int)'), -1)
self.chapter_layout = [i.num_of_pages for i in self.chapters] self.chapter_layout = [i.num_of_pages for i in self.chapters]
self.objects = None self.objects = None
@ -975,4 +977,3 @@ class Document(QGraphicsScene):
def show_page_at_percent(self, p): def show_page_at_percent(self, p):
num = self.num_of_pages*(p/100.) num = self.num_of_pages*(p/100.)
self.show_page(num) self.show_page(num)

View File

@ -98,7 +98,13 @@ class Main(QObject, Ui_MainWindow, MainWindow):
self.renderer.lrf.device_info.height) self.renderer.lrf.device_info.height)
self.window.setWindowTitle(self.renderer.lrf.metadata.title + ' - ' + __appname__) self.window.setWindowTitle(self.renderer.lrf.metadata.title + ' - ' + __appname__)
self.document_title = self.renderer.lrf.metadata.title self.document_title = self.renderer.lrf.metadata.title
self.document.render(self.renderer.lrf) if self.opts.profile:
import cProfile
render, lrf = self.document.render, self.renderer.lrf
cProfile.runctx('render(lrf)', globals(), locals(), lrf.metadata.title+'.stats')
print 'Stats written to', self.renderer.lrf.metadata.title+'.stats'
else:
self.document.render(self.renderer.lrf)
self.renderer.lrf = None self.renderer.lrf = None
self.graphics_view.setScene(self.document) self.graphics_view.setScene(self.document)
self.graphics_view.show() self.graphics_view.show()
@ -163,6 +169,8 @@ def option_parser():
default=False, action='store_true', dest='visual_debug') default=False, action='store_true', dest='visual_debug')
parser.add_option('--disable-hyphenation', dest='hyphenate', default=True, action='store_false', parser.add_option('--disable-hyphenation', dest='hyphenate', default=True, action='store_false',
help='Disable hyphenation. Should significantly speed up rendering.') help='Disable hyphenation. Should significantly speed up rendering.')
parser.add_option('--profile', dest='profile', default='False', action='store_true',
help='Profile the LRf renderer')
return parser return parser
def main(args=sys.argv, logger=None): def main(args=sys.argv, logger=None):