[cairo] API: cairo_set_current_point()

Behdad Esfahbod behdad at behdad.org
Wed Sep 3 05:32:53 PDT 2008


Chris Wilson wrote:
> 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.

I like this.

Speaking of Postscript, do you feel like implementing cairo_save_path() and
cairo_restore_path()?

behdad

>>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...
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo


More information about the cairo mailing list