[cairo-commit]
pycairo/examples/svg svg2png.py, NONE, 1.1 svgview.py, NONE, 1.1
Steve Chaplin
commit at pdx.freedesktop.org
Wed Mar 2 05:12:59 PST 2005
Committed by: stevech1097
Update of /cvs/cairo/pycairo/examples/svg
In directory gabe:/tmp/cvs-serv24569/examples/svg
Added Files:
svg2png.py svgview.py
Log Message:
SC 2005/03/02
--- NEW FILE: svg2png.py ---
#!/usr/bin/env python
"""Usage: svg2png.py file [files...]
Convert svg files to png\
"""
import sys
import cairo
import cairo.svg
if len(sys.argv) <= 1:
raise SystemExit(__doc__)
for filename in sys.argv[1:]:
if not filename.endswith('.svg'):
print 'skipping "%s": it is not an svg file' % filename
continue
file_out = filename.replace('.svg', '.png')
svg = cairo.svg.Context()
svg.parse (filename)
width, height = svg.size
try:
fileObject = file(file_out, 'wb')
except IOError, exc:
raise SystemExit("%s: %s" % (exc.filename, exc.strerror))
ctx = cairo.Context()
ctx.set_target_png (fileObject, cairo.FORMAT_ARGB32, width, height)
svg.render (ctx)
ctx.show_page()
print 'saved', file_out
--- NEW FILE: svgview.py ---
#!/usr/bin/env python
# TODO
# draw frame round pic to show its borderline
# Zoom-in/out toolbutton
import os
import gtk
import cairo
import cairo.svg
import cairo.gtk
action_list = [
('FileMenu', None, '_File'),
('Open', gtk.STOCK_OPEN, '_Open', '<CTL>O', 'Open a file', 'cb_open'),
('Quit', gtk.STOCK_QUIT, '_Quit', '<CTL>Q', 'Quit application', 'cb_quit'),
]
ui_string = """<ui>
<menubar name='MenuBar'>
<menu action='FileMenu'>
<menuitem action='Open'/>
<separator name='s1'/>
<menuitem action='Quit'/>
</menu>
</menubar>
</ui>"""
def fix_actions (actions, instance):
"UIManager Helper function to map method strings to an instance method"
retval = []
for action in actions:
if len (action) >= 6: # action[5] is the callcack function as a string
action = action[0:5] + (getattr (instance, action[5]),) + action[6:]
retval += [action]
return retval
class Window (gtk.Window):
def __init__ (self, title=None, type=gtk.WINDOW_TOPLEVEL):
gtk.Window.__init__ (self, type)
if title:
self.set_title (title)
self.set_default_size(300, 200)
self.pixmap = None
vbox = gtk.VBox()
self.add (vbox)
# create UIManager menus
ag = gtk.ActionGroup ('WindowActions')
actions = fix_actions (action_list, self)
ag.add_actions (actions)
self.ui = gtk.UIManager()
self.ui.insert_action_group (ag, 0)
self.add_accel_group (self.ui.get_accel_group())
try:
self.ui.add_ui_from_string (ui_string)
except gobject.GError, exc:
print 'uimanager.add_ui_from_string() error:', exc
else:
path = '/MenuBar'
menubar = self.ui.get_widget (path)
if menubar:
vbox.pack_start (menubar, expand=False)
else:
print "Error: uimanager.get_widget('%s') failed" % path
self.fileselect = MyFileChooserDialog(parent=self)
self.da = gtk.DrawingArea()
vbox.pack_start (self.da, expand=True)
def cb_expose_event (da, event, data=None):
if self.pixmap:
# center on screen
xdest = max (0, (da.allocation.width -da.svg_width)//2)
ydest = max (0, (da.allocation.height-da.svg_height)//2)
self.da.window.draw_drawable(self.style.bg_gc[gtk.STATE_NORMAL],
self.pixmap,
0, 0, xdest, ydest, -1, -1)
self.da.connect ('expose-event', cb_expose_event)
def cb_open (self, action, data=None):
"""Open svg file (if one is selected) and render to an off-screen
pixmap
"""
filename = self.fileselect.get_filename_from_user()
if filename == None:
return
svg = cairo.svg.Context()
try:
svg.parse (filename)
except Exception, exc:
print exc
return
width, height = svg.size
self.da.svg_width, self.da.svg_height = width, height
ctx = cairo.Context()
self.pixmap = gtk.gdk.Pixmap (self.da.window, width, height)
self.pixmap.draw_rectangle (self.style.bg_gc[gtk.STATE_NORMAL], True, 0, 0, width, height)
cairo.gtk.set_target_drawable(ctx, self.pixmap)
svg.render (ctx)
self.da.queue_draw()
def cb_quit (self, action, data=None):
gtk.main_quit()
class MyFileChooserDialog (gtk.FileChooserDialog):
"""A custom GtkFileSelection class that gets a filename from a user and
remembers the current dir the next time the fileselection is used.
"""
def __init__ (self,
title = 'Select a file',
parent = None,
action = gtk.FILE_CHOOSER_ACTION_OPEN,
buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OPEN, gtk.RESPONSE_OK),
backend = '',
path = None):
super (MyFileChooserDialog, self).__init__ (title, parent, action, buttons, backend)
if path: self.path = path
else: self.path = os.getcwd() + os.sep
ffilter = gtk.FileFilter()
ffilter.set_name ("SVG files")
ffilter.add_pattern ("*.svg")
self.add_filter (ffilter)
ffilter = gtk.FileFilter()
ffilter.set_name ("All files")
ffilter.add_pattern ("*")
self.add_filter (ffilter)
# previews
self.preview = gtk.Image()
self.set_preview_widget (self.preview)
self.connect ("update-preview", self.update_preview_cb)
def update_preview_cb(self, widget, data=None):
filename = self.get_preview_filename()
if filename is None or not os.path.isfile(filename):
self.set_preview_widget_active (False)
return
try:
pixbuf = gtk.gdk.pixbuf_new_from_file_at_size (filename, 128, 128)
self.preview.set_from_pixbuf (pixbuf)
self.set_preview_widget_active (True)
except Exception, exc:
self.set_preview_widget_active (False)
def get_filename_from_user (self, path=None, title=None):
if path: self.path = path
if title: self.set_title (title)
if self.path.endswith (os.sep):
self.set_current_folder (self.path)
else:
self.set_filename (self.path)
filename = None
if self.run() == gtk.RESPONSE_OK:
self.path = filename = self.get_filename()
self.hide()
return filename
if __name__ == '__main__':
app = Window (title='SVGView')
app.connect('destroy', gtk.main_quit)
app.show_all()
gtk.main()
More information about the cairo-commit
mailing list