[docs] Add a Path migration guide

ClutterBehaviourPath has been changed and ClutterBehaviourBspline has
been removed; now we use ClutterPath everywhere we need to describe a
path. This warrants a chapter in the migration guide.
This commit is contained in:
Emmanuele Bassi 2009-09-09 16:01:07 +01:00
parent 3cc56b2b13
commit f4e272ee9b
3 changed files with 172 additions and 2 deletions

View File

@ -120,7 +120,8 @@ content_files= \
clutter-overview.xml \ clutter-overview.xml \
building-clutter.xml \ building-clutter.xml \
running-clutter.xml \ running-clutter.xml \
migrating-ClutterEffect.xml migrating-ClutterEffect.xml \
migrating-ClutterPath.xml
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
# These files must be listed here *and* in content_files # These files must be listed here *and* in content_files
@ -133,7 +134,8 @@ expand_content_files= \
clutter-overview.xml \ clutter-overview.xml \
building-clutter.xml \ building-clutter.xml \
running-clutter.xml \ running-clutter.xml \
migrating-ClutterEffect.xml migrating-ClutterEffect.xml \
migrating-ClutterPath.xml
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
# Only needed if you are using gtkdoc-scangobj to dynamically query widget # Only needed if you are using gtkdoc-scangobj to dynamically query widget

View File

@ -187,6 +187,7 @@
</partintro> </partintro>
<xi:include href="xml/migrating-ClutterEffect.xml"/> <xi:include href="xml/migrating-ClutterEffect.xml"/>
<xi:include href="xml/migrating-ClutterPath.xml"/>
</part> </part>

View File

@ -0,0 +1,167 @@
<?xml version="1.0"?>
<!DOCTYPE chapter PUBLIC
"-//OASIS//DTD DocBook XML V4.3//EN"
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
]>
<chapter id="migrating-ClutterPath">
<chapterinfo>
<author>
<firstname>Emmanuele</firstname>
<surname>Bassi</surname>
<affiliation>
<address>
<email>ebassi@linux.intel.com</email>
</address>
</affiliation>
</author>
</chapterinfo>
<title>Migrating to ClutterPath</title>
<para>Between Clutter 0.8 and Clutter 1.0 the #ClutterBehaviourPath
behaviour lost all the path manipulation functions and the
<structname>ClutterBehaviourBspline</structname> class was entirely
deprecated.</para>
<para>The class that replaced the path description and manipulation
functionality is called #ClutterPath. A #ClutterPath allows
describing a path using a sequence of #ClutterPahtNode<!-- -->s or
using a subset of the SVG path description syntax. A Path instance
also allows describing complex paths, with linear and Bezier segments
and with gaps.</para>
<para>Finally, #ClutterPath also provides integration with Cairo,
by being able to add paths described by the Cairo
<structname>cairo_path_t</structname> data structure and being able
to "replay" a #ClutterPath onto a <structname>cairo_t</structname>
Cairo context.</para>
<section id="creating-paths">
<title>Creating a #ClutterPath</title>
<para>Before Clutter 1.0, all the path-related functions inside
#ClutterBehaviourPath and <structname>ClutterBehaviourBspline</structname>
were replicated, but were also subtly different given the different nature
of the types of path handled by the two #ClutterBehaviour<!-- -->s.</para>
<example id="example-clutter-behaviour-path">
<title>ClutterBehaviourPath example</title>
<para>The following code shows how a #ClutterBehaviourPath was
created prior to the introduction of #ClutterPath. The path described
is a square box between 100, 100 and 200, 200.</para>
<programlisting>
ClutterBehaviour *behaviour;
ClutterKnot knots[] = {
{ 100, 100 },
{ 200, 100 },
{ 200, 200 },
{ 100, 200 },
{ 100, 100 }
};
behaviour = clutter_behaviour_path_new (alpha, knots, G_N_ELEMENTS (knots));
</programlisting>
</example>
<para>The construction for a B-Spline path behaviour was similar, though
the #ClutterKnot<!-- -->s could only describe a curvilinear path.</para>
<example id="example-construct-clutter-path">
<title>Constructing ClutterPath</title>
<para>The following code shows how to construct a #ClutterPath and
assign it to a #ClutterBehaviourPath. The created path is the same as
the example above.</para>
<programlisting>
ClutterBehaviour *behaviour;
ClutterPath *path;
path = clutter_path_new ();
clutter_path_add_move_to (path, 100, 100);
clutter_path_add_line_to (path, 200, 100);
clutter_path_add_line_to (path, 200, 200);
clutter_path_add_line_to (path, 100, 200);
clutter_path_add_close (path);
behaviour = clutter_behaviour_path_new (alpha, path);
</programlisting>
</example>
<para><note>A #ClutterPath object can be shared across behaviours, just
like the #ClutterAlpha objects can.</note></para>
<para>Path can be described by using a subset of the SVG notation for
paths as well as using #ClutterPathNode structures.</para>
<example id="example-describe-clutter-path">
<title>Describing ClutterPath</title>
<para>The SVG path notation subset used by #ClutterPath is in
string format and can be both set as the whole path description
using clutter_path_set_description() or can be added to an
existing #ClutterPath using clutter_path_add_string(). The following
example shows the same path as the two examples above.</para>
<programlisting>
ClutterPath *path = clutter_path_new ();
clutter_path_set_description (path,
"M 100,100 " /* move to */
"L 200,100 " /* line to */
"L 200,200 "
"L 100,200 "
"z" /* close */);
</programlisting>
</example>
<para>A #ClutterPath can describe not only linear, closed paths; it
can also describe paths with Beziér curvers and can add gaps.</para>
<example id="example-describe-mixed-clutter-path">
<title>Describing a mixed ClutterPath</title>
<para>A mixed #ClutterPath, with a Beziér curve between the point
at 200, 200 and 100, 100 and both control points in 100, 200.</para>
<programlisting>
ClutterPath *path = clutter_path_new ();
clutter_path_set_description (path,
"M 100,100 "
"L 200,100 "
"L 200,200 "
"C 100,200 100,200 100,100");
</programlisting>
</example>
</section>
<section id="iterating-paths">
<title>Iterating over a #ClutterPath</title>
<para>It is possible to iterate over all the #ClutterPathNode<!-- -->s
inside a #ClutterPath by using clutter_path_get_nodes(), which will return
a #GSList of #ClutterPathNode<!-- -->s; or by using clutter_path_foreach()
with a function.</para>
<para>The function pointer passed to clutter_path_foreach() should have the
following definition:</para>
<informalexample><programlisting>
static void
foreach_node (ClutterPathNode *path_node,
gpointer user_data)
{
}
</programlisting></informalexample>
</section>
<section id="using-cairo">
<title>Integration with Cairo</title>
<para>A #ClutterPath can use a previously defined
<structname>cairo_path_t</structname> to add new nodes, by using
the clutter_path_add_cairo_path() function.</para>
<para>It is also possible to paint a #ClutterPath on a Cairo context,
by moving the Cairo pen across the nodes of the path using the
clutter_path_to_cairo_path() function.</para>
</section>
</chapter>