I’ve finally found the motivation to begin the implementation of SVG filters in lasem. It’s still pretty rough, there’s a lot of bugs to fix and things to finish, but when I’ve tried to render icons from gnome-icon-theme, a very large subset of this theme renders fine. Here’s an example:
For now, feGaussianBlur, feOffset, feBlend, feMerge, feMergeNode, feComposite and feFlood are supported. Support the remaining filter primitive should appear soon. Fortunately, I’m able to use Caleb Moore’s librsvg code (same license) for the filter algorithms, even if I try to use cairo API when possible.
I’ve done some work on markers, fixing overflow and automatic marker orientation:
I’ve also lately worked on the robustness of lasem, by importing in the test suite a lot of the attached files in librsvg bug reports, thanks to Olav Vitters who gave me the method for an automatic extraction of attached files in bugzilla. I’ve first downloaded the result of a bugzilla query as xml, then wrote a small script which finds attachement url and retrieves them.
Here’s the script (be careful if you use it, as bugzilla will ban you if you download a large amount of data):
from xml.dom.minidom import parseString
def getText (element, tag):
nodelist = element.getElementsByTagName (tag).childNodes
rc = 
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
count = 0
file = open('librsvg.xml')
data = file.read()
dom = parseString(data)
bugs = dom.getElementsByTagName('bug')
for bug in bugs:
bug_id = getText (bug, 'bug_id')
attachments = bug.getElementsByTagName('attachment')
for attachment in attachments:
if attachment.getAttribute('ispatch') != "1":
attachment_id = getText (attachment, 'attachid')
type = getText (attachment, 'type')
if type == 'image/svg+xml' or type == 'image/png':
filename = getText (attachment, 'filename')
url = "http://bugzilla-attachments.gnome.org/attachment.cgi?id=%s" % attachment_id
output_filename = "librsvg/librsvg-bug%s-%s" % (bug_id, filename)
input_file = urllib2.urlopen( url)
data = input_file.read ()
output_file = open(output_filename, 'w')
count = count + 1
Since GMathml is no longer only a MathML library, but can also render SVG now, I have renamed it to Lasem. The name comes from the city of Lasem, known for its batik manufactures. It could be the acronym for “Library for Awesome SVG and Exceptional MathML”. But to be honest, it’s more an acronym for “Library for Awful SVG and Eccentric MathML”.
Only a really small subset of SVG 1.1 is supported for now. Here’s some samples of what can do Lasem:
For some months (actually almost one year), I’m working on a mathml renderer based on gobject and cairo, with a DOM like interface. It has started as a vala experiment, but after a few weeks, after being blocked in my work by some bugs or missing features, I came back to raw gobject programming. Most of the vala bugs I’ve encountered are probably fixed by now, so it’s possible I’ll try to get back to vala one day.
It consists in a library, libgmathml, and a small rendering application, gmathmlrender, which is able to output to either PNG, PDF or SVG. In addition to mathml, gmathml also understand itex, by the mean of itex2mml (http://golem.ph.utexas.edu/~distler/blog/itex2MML.html).