move font registration to draw module, make its fallback actually work properly

This commit is contained in:
Sumpfork 2015-11-20 12:25:16 -08:00
parent 4b9956006a
commit 95011627e5
2 changed files with 32 additions and 28 deletions

View File

@ -6,8 +6,6 @@ import sys
from reportlab.lib.pagesizes import LETTER, A4 from reportlab.lib.pagesizes import LETTER, A4
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from cards import Card from cards import Card
from draw import DividerDrawer from draw import DividerDrawer
@ -180,21 +178,6 @@ def parse_cardsize(spec, sleeved):
def read_write_card_data(options): def read_write_card_data(options):
try:
dirn = os.path.join(options.data_path, 'fonts')
pdfmetrics.registerFont(
TTFont('MinionPro-Regular', os.path.join(dirn, 'MinionPro-Regular.ttf')))
pdfmetrics.registerFont(
TTFont('MinionPro-Bold', os.path.join(dirn, 'MinionPro-Bold.ttf')))
pdfmetrics.registerFont(
TTFont('MinionPro-Oblique', os.path.join(dirn, 'MinionPro-It.ttf')))
except:
raise
pdfmetrics.registerFont(
TTFont('MinionPro-Regular', 'OptimusPrincepsSemiBold.ttf'))
pdfmetrics.registerFont(
TTFont('MinionPro-Bold', 'OptimusPrinceps.ttf'))
data_dir = os.path.join(options.data_path, "card_db", options.language) data_dir = os.path.join(options.data_path, "card_db", options.language)
card_db_filepath = os.path.join(data_dir, "cards.json") card_db_filepath = os.path.join(data_dir, "cards.json")
with codecs.open(card_db_filepath, "r", "utf-8") as cardfile: with codecs.open(card_db_filepath, "r", "utf-8") as cardfile:

View File

@ -1,5 +1,6 @@
import os import os
import re import re
import sys
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase import pdfmetrics
@ -7,6 +8,7 @@ from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph from reportlab.platypus import Paragraph
from reportlab.lib.enums import TA_JUSTIFY from reportlab.lib.enums import TA_JUSTIFY
from reportlab.pdfgen import canvas from reportlab.pdfgen import canvas
from reportlab.pdfbase.ttfonts import TTFont
def split(l, n): def split(l, n):
@ -23,9 +25,29 @@ class DividerDrawer(object):
self.odd = True self.odd = True
self.canvas = None self.canvas = None
def registerFonts(self):
try:
dirn = os.path.join(self.options.data_path, 'fonts')
self.fontNameRegular = 'MinionPro-Regular'
pdfmetrics.registerFont(
TTFont(self.fontNameRegular, os.path.join(dirn, 'MinionPro-Regular.ttf')))
self.fontNameBold = 'MinionPro-Bold'
pdfmetrics.registerFont(
TTFont(self.fontNameBold, os.path.join(dirn, 'MinionPro-Bold.ttf')))
self.fontNameOblique = 'MinionPro-Oblique'
pdfmetrics.registerFont(
TTFont(self.fontNameOblique, os.path.join(dirn, 'MinionPro-It.ttf')))
except:
print >>sys.stderr, "Warning, Minion Pro Font ttf file not found! Falling back on Times"
self.fontNameRegular = 'Times-Roman'
self.fontNameBold = 'Times-Bold'
self.fontNameOblique = 'Times-Oblique'
def draw(self, fname, cards, options): def draw(self, fname, cards, options):
self.options = options self.options = options
self.registerFonts()
dividerWidth = options.dividerWidth dividerWidth = options.dividerWidth
dividerHeight = options.dividerHeight dividerHeight = options.dividerHeight
tabLabelWidth = options.labelWidth tabLabelWidth = options.labelWidth
@ -158,7 +180,7 @@ class DividerDrawer(object):
mask=[255, 255, 255, 255, 255, 255]) mask=[255, 255, 255, 255, 255, 255])
width += potSize width += potSize
self.canvas.setFont('MinionPro-Bold', 12) self.canvas.setFont(self.fontNameBold, 12)
cost = str(card.cost) cost = str(card.cost)
self.canvas.drawCentredString(x + 8, costHeight, cost) self.canvas.drawCentredString(x + 8, costHeight, cost)
return width return width
@ -168,16 +190,15 @@ class DividerDrawer(object):
self.canvas.drawImage( self.canvas.drawImage(
os.path.join(self.options.data_path, 'images', setImage), x, y, 14, 12, mask='auto') os.path.join(self.options.data_path, 'images', setImage), x, y, 14, 12, mask='auto')
@classmethod
def nameWidth(self, name, fontSize): def nameWidth(self, name, fontSize):
w = 0 w = 0
name_parts = name.split() name_parts = name.split()
for i, part in enumerate(name_parts): for i, part in enumerate(name_parts):
if i != 0: if i != 0:
w += pdfmetrics.stringWidth(' ', 'MinionPro-Regular', fontSize) w += pdfmetrics.stringWidth(' ', self.fontNameRegular, fontSize)
w += pdfmetrics.stringWidth(part[0], 'MinionPro-Regular', fontSize) w += pdfmetrics.stringWidth(part[0], self.fontNameRegular, fontSize)
w += pdfmetrics.stringWidth(part[1:], w += pdfmetrics.stringWidth(part[1:],
'MinionPro-Regular', fontSize - 2) self.fontNameRegular, fontSize - 2)
return w return w
def drawTab(self, card, rightSide): def drawTab(self, card, rightSide):
@ -226,7 +247,7 @@ class DividerDrawer(object):
if self.options.use_text_set_icon: if self.options.use_text_set_icon:
setImageHeight = card.getType().getTabTextHeightOffset() setImageHeight = card.getType().getTabTextHeightOffset()
setText = card.setTextIcon() setText = card.setTextIcon()
self.canvas.setFont('MinionPro-Oblique', 8) self.canvas.setFont(self.fontNameOblique, 8)
if setText is None: if setText is None:
setText = "" setText = ""
@ -284,10 +305,10 @@ class DividerDrawer(object):
w = textInset w = textInset
def drawWordPiece(text, fontSize): def drawWordPiece(text, fontSize):
self.canvas.setFont('MinionPro-Regular', fontSize) self.canvas.setFont(self.fontNameRegular, fontSize)
if text != ' ': if text != ' ':
self.canvas.drawString(w, h, text) self.canvas.drawString(w, h, text)
return pdfmetrics.stringWidth(text, 'MinionPro-Regular', fontSize) return pdfmetrics.stringWidth(text, self.fontNameRegular, fontSize)
for i, word in enumerate(words): for i, word in enumerate(words):
if i != 0: if i != 0:
w += drawWordPiece(' ', fontSize) w += drawWordPiece(' ', fontSize)
@ -302,10 +323,10 @@ class DividerDrawer(object):
words.reverse() words.reverse()
def drawWordPiece(text, fontSize): def drawWordPiece(text, fontSize):
self.canvas.setFont('MinionPro-Regular', fontSize) self.canvas.setFont(self.fontNameRegular, fontSize)
if text != ' ': if text != ' ':
self.canvas.drawRightString(w, h, text) self.canvas.drawRightString(w, h, text)
return -pdfmetrics.stringWidth(text, 'MinionPro-Regular', fontSize) return -pdfmetrics.stringWidth(text, self.fontNameRegular, fontSize)
for i, word in enumerate(words): for i, word in enumerate(words):
w += drawWordPiece(word[1:], fontSize - 2) w += drawWordPiece(word[1:], fontSize - 2)
w += drawWordPiece(word[0], fontSize) w += drawWordPiece(word[0], fontSize)
@ -411,7 +432,7 @@ class DividerDrawer(object):
# calculate the text height, font size, and orientation # calculate the text height, font size, and orientation
maxFontsize = 12 maxFontsize = 12
minFontsize = 6 minFontsize = 6
fontname = 'MinionPro-Regular' fontname = self.fontNameRegular
font = pdfmetrics.getFont(fontname) font = pdfmetrics.getFont(fontname)
fontHeightRelative = (font.face.ascent + abs(font.face.descent)) / 1000.0 fontHeightRelative = (font.face.ascent + abs(font.face.descent)) / 1000.0