odoo/bin/reportlab/lib/fonts.py

90 lines
3.2 KiB
Python

#!/bin/env python
#Copyright ReportLab Europe Ltd. 2000-2004
#see license.txt for license details
#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/fonts.py
__version__=''' $Id: fonts.py 2385 2004-06-17 15:26:05Z rgbecker $ '''
import string, sys, os
###############################################################################
# A place to put useful font stuff
###############################################################################
#
# Font Mappings
# The brute force approach to finding the correct postscript font name;
# much safer than the rule-based ones we tried.
# preprocessor to reduce font face names to the shortest list
# possible. Add any aliases you wish; it keeps looking up
# until it finds no more translations to do. Any input
# will be lowercased before checking.
_family_alias = {
'serif':'times',
'sansserif':'helvetica',
'monospaced':'courier',
'arial':'helvetica'
}
#maps a piddle font to a postscript one.
_tt2ps_map = {
#face, bold, italic -> ps name
('times', 0, 0) :'Times-Roman',
('times', 1, 0) :'Times-Bold',
('times', 0, 1) :'Times-Italic',
('times', 1, 1) :'Times-BoldItalic',
('courier', 0, 0) :'Courier',
('courier', 1, 0) :'Courier-Bold',
('courier', 0, 1) :'Courier-Oblique',
('courier', 1, 1) :'Courier-BoldOblique',
('helvetica', 0, 0) :'Helvetica',
('helvetica', 1, 0) :'Helvetica-Bold',
('helvetica', 0, 1) :'Helvetica-Oblique',
('helvetica', 1, 1) :'Helvetica-BoldOblique',
# there is only one Symbol font
('symbol', 0, 0) :'Symbol',
('symbol', 1, 0) :'Symbol',
('symbol', 0, 1) :'Symbol',
('symbol', 1, 1) :'Symbol',
# ditto for dingbats
('zapfdingbats', 0, 0) :'ZapfDingbats',
('zapfdingbats', 1, 0) :'ZapfDingbats',
('zapfdingbats', 0, 1) :'ZapfDingbats',
('zapfdingbats', 1, 1) :'ZapfDingbats',
}
_ps2tt_map={}
for k,v in _tt2ps_map.items():
if not _ps2tt_map.has_key(k):
_ps2tt_map[string.lower(v)] = k
def ps2tt(psfn):
'ps fontname to family name, bold, italic'
psfn = string.lower(psfn)
if _ps2tt_map.has_key(psfn):
return _ps2tt_map[psfn]
raise ValueError, "Can't map determine family/bold/italic for %s" % psfn
def tt2ps(fn,b,i):
'family name + bold & italic to ps font name'
K = (string.lower(fn),b,i)
if _tt2ps_map.has_key(K):
return _tt2ps_map[K]
else:
fn, b1, i1 = ps2tt(K[0])
K = fn, b1|b, i1|i
if _tt2ps_map.has_key(K):
return _tt2ps_map[K]
raise ValueError, "Can't find concrete font for family=%s, bold=%d, italic=%d" % (fn, b, i)
def addMapping(face, bold, italic, psname):
'allow a custom font to be put in the mapping'
k = (string.lower(face), bold, italic)
_tt2ps_map[k] = psname
# rebuild inverse - inefficient
for k,v in _tt2ps_map.items():
if not _ps2tt_map.has_key(k):
_ps2tt_map[string.lower(v)] = k