[cairo] API: cairo_set_current_point()

Chris Wilson chris at chris-wilson.co.uk
Wed Sep 3 02:18:46 PDT 2008


Hi all,
 I'd like to propose this new bit of API to move the current point
without generating a new sub-path: cairo_set_current_point(). My
motivation is from implementing PostScript operators (and type1 fonts,
in particular, depend heavily on this operation). However, it is exactly
the same operation required by Inkscape for its path optimisation,
see http://lists.cairographics.org/archives/cairo/2008-April/013651.html
and the most recent reminder.

>From the Type1 documentation, I have a couple of instances where I need
to explicitly adjust the current point without creating a new path:

closepath -
	closepath closes a subpath. ... Note that, unlike
	the closepath command in the PostScript language, this com-
	mand does not reposition the current point. Any subsequent
	rmoveto must be relative to the current point in force before
	the Type 1 font format closepath command was given.

sbw -
	sets the left sidebearing point to (sbx, sby) and sets the
	character width vector to (wx, wy) in character space. This
	command also sets the current point to (sbx, sby), but does not
	place the point in the character path. Use rmoveto for the first
	point in the path.
[Though because of the explicit rmovetos, they fortuitously work with
cairo_move_to().]

setcurrentpoint -
	sets the current point in the Type 1 font format
	BuildChar to (x, y) in absolute character space coordinates
	without performing a charstring moveto command. This establishes
	the current point for a subsequent relative path building
	command. 

In terms of how I think it works...
cairo_set_current_point() updates the current point, setting the
has_current_point flag so future relative operations do not fail. The
current use of has_current_point is restricted to the relative
operations as the origin of their deltas and a (new last_point,
has_last_point) is introduced to track what is currently referred to as
current_point. That is a line_to() after set_current_point(), performs a
move_to() (and similar effects for curve_to() and arc()) and
close_path() does nothing if has_current_point, but not has_last_point
is set. And paths are only equal if the last_point and not current_point
are the same.

They say a patch speaks a thousand words...
-- 
Chris Wilson
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-API-cairo_set_current_point.patch
Type: text/x-patch
Size: 0 bytes
Desc: 
Url : http://lists.cairographics.org/archives/cairo/attachments/20080903/30a52772/attachment.bin 


More information about the cairo mailing list