- Skalierung gemacht
This commit is contained in:
+118
-29
@@ -21,19 +21,34 @@ def create_picture_frame( config ):
|
||||
params = dict()
|
||||
params['width'] = config.get('globals', 'width')
|
||||
params['height'] = config.get('globals', 'height')
|
||||
params['background'] = config.get('globals', 'background')
|
||||
|
||||
#echo '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">'
|
||||
begintpl = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
version="1.1"
|
||||
width="${width}"
|
||||
height="${height}"
|
||||
>
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
version="1.1"
|
||||
width="${width}"
|
||||
height="${height}"
|
||||
>
|
||||
'''
|
||||
imagetpl = ''' <image width="${width}" height="${height}"
|
||||
xlink:href="file://${background}">
|
||||
</image>
|
||||
'''
|
||||
svgbegin = Template( begintpl ).substitute(params)
|
||||
# falls ein Hintergrundbild verwendet werden soll, dann das genauso gross
|
||||
# machen...
|
||||
try:
|
||||
background = config.get('globals', 'background')
|
||||
font_path = os.path.expandvars(os.path.join('$PICCREATE_BACKGROUNDS', background ))
|
||||
params['background'] = os.path.normpath(font_path)
|
||||
svgbegin = svgbegin + Template( imagetpl ).substitute(params)
|
||||
except ConfigParser.NoOptionError:
|
||||
# dann eben kein Hintergrundbild
|
||||
pass
|
||||
svgend = '</svg>'
|
||||
return svgbegin, svgend
|
||||
|
||||
@@ -41,13 +56,76 @@ def write_font_line( content, font, params ):
|
||||
''' erzeugt den SVG Teil des Bildes aus Einzelkomponenten
|
||||
'''
|
||||
w = Word(content, font, params)
|
||||
return w.GetSVG()
|
||||
wordsvg = w.GetSVG()
|
||||
|
||||
# falls das Wort nun skaliert werden soll
|
||||
if params.has_key('scale'):
|
||||
params['xscale'] = params['scale']
|
||||
params['yscale'] = params['scale']
|
||||
if not params.has_key('xscale'):
|
||||
params['xscale'] = 1.0
|
||||
if not params.has_key('yscale'):
|
||||
params['yscale'] = 1.0
|
||||
|
||||
pic_width = float(params['width'])
|
||||
pic_height = float(params['height'])
|
||||
|
||||
if params.has_key('autoscale'):
|
||||
wordlength = w.calc_length()
|
||||
wordheight = w.calc_height()
|
||||
#print wordlength, wordheight
|
||||
#print pic_width, pic_height
|
||||
fw = pic_width / wordlength
|
||||
fh = pic_height / wordheight
|
||||
#print fw, fh
|
||||
if fw < fh: scale_faktor = fw
|
||||
else: scale_faktor = fh
|
||||
params['xscale'] = scale_faktor
|
||||
params['yscale'] = scale_faktor
|
||||
else:
|
||||
scale_faktor = 1.0
|
||||
|
||||
# berechne immer den richtigen Startpunkt, je nach Bündigkeit
|
||||
if params.has_key('align'):
|
||||
xstart = float(params['x'])
|
||||
if params['align'] == 'left':
|
||||
x = xstart
|
||||
elif params['align'] == 'center':
|
||||
word_length = w.calc_length()
|
||||
x = xstart * scale_faktor + (pic_width - word_length * scale_faktor)/2.0
|
||||
else:
|
||||
word_length = w.calc_length()
|
||||
x = xstart * scale_faktor + pic_width - word_length * scale_faktor
|
||||
params['xstart'] = x
|
||||
else:
|
||||
params['xstart'] = params['x']
|
||||
|
||||
if params.has_key('yalign'):
|
||||
ystart = float(params['y'])
|
||||
if params['yalign'] == 'top':
|
||||
y = 0.0
|
||||
elif params['yalign'] == 'center':
|
||||
word_height = w.calc_height()
|
||||
y = ystart * scale_faktor + (pic_height - word_height * scale_faktor)/2.0
|
||||
elif params['yalign'] == 'bottom':
|
||||
y = ystart * scale_faktor + pic_height - word_height * scale_faktor
|
||||
else:
|
||||
y = ystart
|
||||
params['ystart'] = y
|
||||
else:
|
||||
params['ystart'] = params['y']
|
||||
|
||||
scalebegin = '''<g transform="translate($xstart,$ystart) scale(${xscale},${yscale})">
|
||||
'''
|
||||
scaleend = ''' </g>'''
|
||||
svg = Template( scalebegin ).substitute(params) + wordsvg + scaleend
|
||||
return svg
|
||||
|
||||
def write_random_font_line( config, fontinfos, data ):
|
||||
''' erzeugt den SVG Teil des Bildes aus einem Hintergrundbild und
|
||||
mehreren in Einzelbereichen zufällig platzierten Einzelbildern '''
|
||||
# TODO Bild aus Zufallspositionen von Einzelkomponenten
|
||||
pass
|
||||
return
|
||||
|
||||
class Word:
|
||||
"""Berechnet die x/y Daten jedes Buchstabn zu einem Wort bzw. mehreren
|
||||
@@ -59,22 +137,23 @@ class Word:
|
||||
def __repr__(self):
|
||||
return self.line
|
||||
def calc_length(self):
|
||||
deltax= 0.0
|
||||
glyph_space = float(self.params['glyph_space'])
|
||||
deltax = 0.0
|
||||
for c in self.line:
|
||||
g = self.font.GlyphGet(c)
|
||||
deltax = g.GetLength() + deltax
|
||||
deltax = g.GetLength() + deltax + glyph_space
|
||||
return deltax
|
||||
def calc_height(self):
|
||||
max_y = 0.0
|
||||
for c in self.line:
|
||||
g = self.font.GlyphGet(c)
|
||||
new_y = g.GetHeight()
|
||||
if new_y > max_y:
|
||||
max_y = new_y
|
||||
return max_y
|
||||
def GetSVG(self):
|
||||
params = self.params
|
||||
# berechne immer den richtigen Startpunkt, je nach Bündigkeit
|
||||
if params['align'] == 'left':
|
||||
x = float(params['x'])
|
||||
elif params['align'] == 'center':
|
||||
word_length = self.calc_length()
|
||||
x = float(params['x'] + (params['length'] - word_length)/2.0)
|
||||
else:
|
||||
word_length = self.calc_length()
|
||||
x = float(params['x'] + word_length - params['length'])
|
||||
x = float(params['x'])
|
||||
y = params['y']
|
||||
glyph_space = float(params['glyph_space'])
|
||||
|
||||
@@ -91,7 +170,7 @@ class Word:
|
||||
# diese durch den aktuellen Zählerstand ersetzen
|
||||
if params['counter_replace']:
|
||||
xn = g.GetAttribute('npattern')
|
||||
for i in range(1,int(xn)+1):
|
||||
for i in range(1, int(xn)+1):
|
||||
counter = counter + 1
|
||||
content['x'+str(i)] = counter
|
||||
svgstr = svgstr + g.GetSVG(content)
|
||||
@@ -110,7 +189,7 @@ class Glyph:
|
||||
def GetLength(self):
|
||||
return float(self.GetAttribute('xstep'))
|
||||
def GetHeight(self):
|
||||
return float(self.GetAttribute('ystep'))
|
||||
return float(self.GetAttribute('ymax'))
|
||||
def GetSVG(self, content):
|
||||
t = Template(self.template)
|
||||
svg = t.substitute(content)
|
||||
@@ -177,8 +256,8 @@ def create_picture(config, fontinfos, data, pic_path):
|
||||
|
||||
svgstr = ''
|
||||
|
||||
begin, end = create_picture_frame( config )
|
||||
svgstr = svgstr + begin
|
||||
picbegin, picend = create_picture_frame( config )
|
||||
svgstr = svgstr + picbegin
|
||||
|
||||
# gehe alle Zeilen die im Bild enthalten sein müssen durch
|
||||
lines = config.get('globals', 'lines').split(',')
|
||||
@@ -201,16 +280,26 @@ def create_picture(config, fontinfos, data, pic_path):
|
||||
font = fontinfos[fontname]
|
||||
|
||||
# hol dir die Eckdaten für die Zeile
|
||||
# x, y, align, length
|
||||
params = dict(config.items(linename))
|
||||
# x, y, align, width, height
|
||||
lineparams = dict(config.items(linename))
|
||||
|
||||
picstr = write_font_line( content, font, params )
|
||||
# falls nix angegeben, dann aus hol defaults aus globalen daten
|
||||
if not lineparams.has_key('width'):
|
||||
lineparams['width'] = config.get('globals', 'width')
|
||||
if not lineparams.has_key('height'):
|
||||
lineparams['height'] = config.get('globals', 'height')
|
||||
if not lineparams.has_key('x'):
|
||||
lineparams['x'] = 0.0
|
||||
if not lineparams.has_key('y'):
|
||||
lineparams['y'] = 0.0
|
||||
|
||||
picstr = write_font_line( content, font, lineparams )
|
||||
if picstr: svgstr = svgstr + picstr
|
||||
|
||||
randstr = write_random_font_line( content, font, params)
|
||||
randstr = write_random_font_line( content, font, lineparams)
|
||||
if randstr: svgstr = svgstr + randstr
|
||||
|
||||
svgstr = svgstr + end
|
||||
svgstr = svgstr + picend
|
||||
|
||||
if options.dry:
|
||||
print svgstr
|
||||
|
||||
Reference in New Issue
Block a user