Behdad Esfahbod's daily notes on GNOME, Pango, Fedora, Persian Computing, Bob Dylan, and Dan Bern!

My Photo
Name:
Location: Toronto, Ontario, Canada

Ask Google.

Contact info
Google
Hacker Emblem Become a Friend of GNOME I Power Blogger
follow me on Twitter
Archives
July 2003
August 2003
October 2003
November 2003
December 2003
March 2004
April 2004
May 2004
July 2004
August 2004
September 2004
November 2004
March 2005
April 2005
May 2005
June 2005
July 2005
August 2005
September 2005
October 2005
November 2005
December 2005
January 2006
February 2006
March 2006
April 2006
May 2006
June 2006
July 2006
August 2006
September 2006
October 2006
November 2006
December 2006
January 2007
February 2007
March 2007
April 2007
May 2007
June 2007
July 2007
August 2007
September 2007
October 2007
November 2007
December 2007
January 2008
February 2008
March 2008
April 2008
May 2008
June 2008
July 2008
August 2008
October 2008
November 2008
December 2008
January 2009
March 2009
April 2009
May 2009
June 2009
July 2009
August 2009
November 2009
December 2009
March 2010
April 2010
May 2010
June 2010
July 2010
October 2010
November 2010
April 2011
May 2011
August 2011
September 2011
October 2011
November 2011
November 2012
June 2013
January 2014
May 2015
Current Posts
McEs, A Hacker Life
Tuesday, November 25, 2008
 Text-on-path with cairo

Cairotwisted is the name a piece of code I wrote using pangocairo to lay text on a path. Over the years many people have found it useful, so here is a public post to make sure it's easier to find on the interwebs.

cairotwisted
The code is shipped in Pango tarball under examples/cairotwisted.c and can be browsed here. Click on the thumbnail to see the full size image output.

At the core of it there is a function to map one path onto another one. This is done by parameterizing the second path and computing it's gradient (see the code).

Parameterizing a Bezier curve uniformly is not easy though. I currently flatten curves to lines and use that, but that has its own down sides as the error introduced in the gradient can magnify out of bound. Any ideas?

Labels: , , ,

Comments:
I bow to your awesomeness
 
Ok, now your done with that, where is our UCS4-based API?

Just kidding. Awesome work on Pango. This AbiWord developer bows for you. - uwog
 
hells to the hell yes!
 
I've been a developer on lib2geom (geometry backend for inkscape) for a couple years. One of our main focuses is _not_ doing that conversion to line segments. In order to do this we introduce a path representation known as s-power-basis, which is closed under complex algebraic and calculus operations.

Here's basically how we do path-along-path:

PwD2 uskeleton = arc_length_parametrization(skeleton,2,.1)
PwD2 n = force_continuity(rot90(derivative(uskeleton));
PwD2 output = compose(uskeleton, path[X]) + path[Y] * compose(n, path[X]);

(PwD2 is actually a template type I can't write without blogger's html tag stuff getting pissy)

And that's it. Converting sbasis to / from beziers is very efficient - we do all our rendering with cairo.
 
Post a Comment



<< Archive
<< Home