<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.inkscape.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Inkscape%2Fliveeffectsgoodness</id>
	<title>Inkscape/liveeffectsgoodness - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.inkscape.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Inkscape%2Fliveeffectsgoodness"/>
	<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape/liveeffectsgoodness&amp;action=history"/>
	<updated>2026-04-19T15:27:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Inkscape/liveeffectsgoodness&amp;diff=13894&amp;oldid=prev</id>
		<title>Bbb: Redirecting to LivePathEffects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape/liveeffectsgoodness&amp;diff=13894&amp;oldid=prev"/>
		<updated>2007-03-09T19:11:53Z</updated>

		<summary type="html">&lt;p&gt;Redirecting to &lt;a href=&quot;/wiki/LivePathEffects&quot; title=&quot;LivePathEffects&quot;&gt;LivePathEffects&lt;/a&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.inkscape.org/wiki/index.php?title=Inkscape/liveeffectsgoodness&amp;amp;diff=13894&amp;amp;oldid=13892&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Bbb</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Inkscape/liveeffectsgoodness&amp;diff=13892&amp;oldid=prev</id>
		<title>Bbb at 19:10, 9 March 2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape/liveeffectsgoodness&amp;diff=13892&amp;oldid=prev"/>
		<updated>2007-03-09T19:10:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:10, 9 March 2007&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;BByak's email detailing &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pathe &lt;/del&gt;effects stage II&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;= Introduction =&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Live Path Effects are an Inkscape subsystem where arbitrary path-changing effects can be applied to any path object. These effects are fully live and interactive. Inkscape will remember the original path before the transformation was applied, so you will be able to remove the effect, chain several effects on the same path, adjust their parameters, etc. All the effects metadata will be stored in Inkscape-only attributes. At the same time, the resulting visible path (with the effects applied) is saved using pure SVG elements and attributes and thus visible to all SVG renderers, thus upholding Inkscape's basic principle of operation: drawings must ''look'' exactly the same in Inkscape as in any SVG-compliant renderer. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The Stage I was a very simple test done by ACSpike. It proved the feasibility of the approach. Now we need to move ahead.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;= &lt;/ins&gt;BByak's email detailing &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;live path &lt;/ins&gt;effects&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, &lt;/ins&gt;stage II &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Overall, our Stage II goals are:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Overall, our Stage II goals are:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l28&quot;&gt;Line 28:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 34:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Now, the goals in detail:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Now, the goals in detail:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;1. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Rename inkscape:distorted into &lt;/del&gt;inkscape:path-effect&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. This&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;1. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The &lt;/ins&gt;inkscape:path-effect&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;attribute would store a string identifier of the effect to apply,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;attribute would store a string identifier of the effect to apply,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;or &amp;quot;none&amp;quot;. If there's no such attribute, it's the same as&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;or &amp;quot;none&amp;quot;. If there's no such attribute, it's the same as&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bbb</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Inkscape/liveeffectsgoodness&amp;diff=12788&amp;oldid=prev</id>
		<title>Acspike at 00:45, 23 January 2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape/liveeffectsgoodness&amp;diff=12788&amp;oldid=prev"/>
		<updated>2007-01-23T00:45:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;BByak's email detailing pathe effects stage II&lt;br /&gt;
&lt;br /&gt;
Overall, our Stage II goals are:&lt;br /&gt;
&lt;br /&gt;
1. make the system capable of handling several different effects,&lt;br /&gt;
with new ones easy to add&lt;br /&gt;
&lt;br /&gt;
2. make sure effects are correctly read in SPPath and in all&lt;br /&gt;
shapes&lt;br /&gt;
&lt;br /&gt;
3. make sure objects with effects are correctly transformed&lt;br /&gt;
&lt;br /&gt;
4. make sure paths with effects are correctly node-edited&lt;br /&gt;
&lt;br /&gt;
5. make sure shapes with effects are correctly handle-edited&lt;br /&gt;
&lt;br /&gt;
6. make sure objects with effects are correctly written and&lt;br /&gt;
rendered the same in Batik&lt;br /&gt;
&lt;br /&gt;
Most of these goals are surprisingly easy to achieve  :)  So don't&lt;br /&gt;
be frightened by the length of this email - it's just wordy&lt;br /&gt;
explanations.&lt;br /&gt;
&lt;br /&gt;
After all this works, we can move on to implementing the Path&lt;br /&gt;
Effects tool and handle-dragging UI for editing effects on&lt;br /&gt;
canvas... that will be Stage III.&lt;br /&gt;
&lt;br /&gt;
Now, the goals in detail:&lt;br /&gt;
&lt;br /&gt;
1. Rename inkscape:distorted into inkscape:path-effect. This&lt;br /&gt;
attribute would store a string identifier of the effect to apply,&lt;br /&gt;
or &amp;quot;none&amp;quot;. If there's no such attribute, it's the same as&lt;br /&gt;
&amp;quot;none&amp;quot;. In addition, register several attributes for distortion&lt;br /&gt;
parameters:&lt;br /&gt;
&lt;br /&gt;
inkscape:path-effect-param1&lt;br /&gt;
inkscape:path-effect-param2&lt;br /&gt;
inkscape:path-effect-param3&lt;br /&gt;
&lt;br /&gt;
etc. The interpretation of these will of course depend on the&lt;br /&gt;
value of inkscape:path-effect.&lt;br /&gt;
&lt;br /&gt;
Then, move the reading of these attributes into SPShape, as they&lt;br /&gt;
will be used by all its subclasses (not only SPPath but also&lt;br /&gt;
shapes) in the same way. (That is, sp_object_read_attr(object,&lt;br /&gt;
&amp;quot;inkscape:path-effect&amp;quot;) etc must also be in sp_shape_build.)&lt;br /&gt;
Store the values in appropriate new members of SPShape. Write a&lt;br /&gt;
generic function that takes SPCurve and a SPShape pointers and&lt;br /&gt;
distorts the SPCurve according to the values of the members of&lt;br /&gt;
SPShape. Store that function in sp-shape.cpp and declare in&lt;br /&gt;
sp-shape.h so that it can be used from outside.&lt;br /&gt;
&lt;br /&gt;
You can even code a couple useful effects at this stage  :) &lt;br /&gt;
&lt;br /&gt;
2. For SPPath, it's all ready: it reads original-d, distorts it&lt;br /&gt;
and sets the curve from that. In shapes, it's even simpler. Take&lt;br /&gt;
SPStar for an example. In sp-star.cpp, find the line&lt;br /&gt;
&lt;br /&gt;
	sp_shape_set_curve_insync (SP_SHAPE (star), c, TRUE);&lt;br /&gt;
&lt;br /&gt;
and just insert the call to the distortion function in sp-shape&lt;br /&gt;
before that, passing it the curve and SP_SHAPE (star). That is&lt;br /&gt;
all! Shapes have no need for original-d because their path is&lt;br /&gt;
generated from the shape parameters anyway.&lt;br /&gt;
&lt;br /&gt;
3. Transforming objects works like this. In &amp;quot;preserve&amp;quot; mode (see&lt;br /&gt;
Inkscape Prefs), a transform= attribute is added or edited on all&lt;br /&gt;
transformed objects. In the &amp;quot;optimize&amp;quot; mode (which is the&lt;br /&gt;
default), various types of objects variously try to embed the&lt;br /&gt;
transform, or a component thereof. If this is not possible, again,&lt;br /&gt;
transform= attribute is added. For example, for paths,&lt;br /&gt;
sp_path_transform can completely embed all of the transform into&lt;br /&gt;
its curve (i.e. into d=), by transforming each path point by that&lt;br /&gt;
matrix, so it returns identity and transform= is not set. For&lt;br /&gt;
rects, sp_rect_set_transform embeds only translation and scaling&lt;br /&gt;
components of the matrix; the remainder, if any, is written as&lt;br /&gt;
transform=. For stars and ellipses, no embedding is attempted at&lt;br /&gt;
all, so the whole transform is always written as transform=.&lt;br /&gt;
&lt;br /&gt;
Now, for paths, sp_path_transform currently transforms the&lt;br /&gt;
(SPShape*)path-&amp;gt;curve, i.e. the distorted curve stored in base&lt;br /&gt;
SPShape instance. But we also need to transform the original path&lt;br /&gt;
by the same matrix too, so that it stays in sync. The easiest way&lt;br /&gt;
to do this, which will also have other benefits, is to store the&lt;br /&gt;
original path in SPPath as another SPCurve. That is,&lt;br /&gt;
(SPShape*)path-&amp;gt;curve will be the distorted path, while&lt;br /&gt;
(SPPath*)path-&amp;gt;original_curve will store the original path.&lt;br /&gt;
&lt;br /&gt;
You will thus need to add this member in sp-path.h and to add to&lt;br /&gt;
store the original SPCurve before distortion in that member in&lt;br /&gt;
sp_path_set, case SP_ATTR_ORIGINAL_D. (You may need to figure out&lt;br /&gt;
how to copy SPCurves and/or bpaths. Also don't forget to free the&lt;br /&gt;
SPCurve when destroying the path in sp_path_release.) Then look at&lt;br /&gt;
sp_path_transform:&lt;br /&gt;
&lt;br /&gt;
    /* Transform the path */&lt;br /&gt;
    NRBPath dpath, spath;&lt;br /&gt;
    spath.path = shape-&amp;gt;curve-&amp;gt;bpath;&lt;br /&gt;
    nr_path_duplicate_transform(&amp;amp;dpath, &amp;amp;spath, xform);&lt;br /&gt;
    SPCurve *curve = sp_curve_new_from_bpath(dpath.path);&lt;br /&gt;
    if (curve) {&lt;br /&gt;
        sp_shape_set_curve(shape, curve, TRUE);&lt;br /&gt;
        sp_curve_unref(curve);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
And just do the same also for your original SPCurve stored in&lt;br /&gt;
SPPath. That is all.&lt;br /&gt;
&lt;br /&gt;
For shapes, you normally don't need to do anything at all. Those&lt;br /&gt;
that don't attempt any embedding and always use transform=&lt;br /&gt;
attribute are not affected at all. Those that do embed do it just&lt;br /&gt;
by adjusting their internal shape parameters and regenerating the&lt;br /&gt;
curve - for example sp_rect_set_transform calls&lt;br /&gt;
sp_rect_set_shape(rect). Provided you inserted a distortion call&lt;br /&gt;
into *_set_shape, you are all set.&lt;br /&gt;
&lt;br /&gt;
CAVEAT: rects are the only shape which currently uses &amp;lt;rect&amp;gt;, not&lt;br /&gt;
&amp;lt;path&amp;gt;. So you cannot apply shape effects to rects at all, until&lt;br /&gt;
this is changed. It's on my TODO for a long time, hope I will get&lt;br /&gt;
a round tuit soon.&lt;br /&gt;
&lt;br /&gt;
4. The Inkscape::NodePath::Path reads the path from SPCurve, but&lt;br /&gt;
after modifying it, it writes directly to the d= attribute. This&lt;br /&gt;
needs to be changed thus: (a) if the path is distorted, read the&lt;br /&gt;
SPCurve from SPPath, not from SPShape (i.e. the original, not the&lt;br /&gt;
distorted one), and (b) if the path is distorted, write the edited&lt;br /&gt;
path to inkscape:original-d= instead of d= (in&lt;br /&gt;
update_repr_internal). Setting inkscape:original-d will trigger&lt;br /&gt;
reading it and setting both original and distorted curves, the&lt;br /&gt;
latter in turn triggering a redisplay of the distorted path. So I&lt;br /&gt;
think this will be enough for nodepath to edit the source path,&lt;br /&gt;
with the nodes generally not lying on the visible distorted&lt;br /&gt;
path. Adding a helper display of the original path between&lt;br /&gt;
nodepath nodes can be left for later.&lt;br /&gt;
&lt;br /&gt;
5. I think here nothing at all is needed. The knotholder thing&lt;br /&gt;
reads and writes from the shape's internal parameters, and thus is&lt;br /&gt;
totally unaffected by the visible distorted path.&lt;br /&gt;
&lt;br /&gt;
6. Look at sp_path_write: it writes the d= attribute from&lt;br /&gt;
(SPShape*)path-&amp;gt;curve, that is, from the distorted path. So the&lt;br /&gt;
&amp;quot;same display in Batik&amp;quot; part is already taken care of. We only&lt;br /&gt;
need to write the original-d so it stays in sync. Just repeat this&lt;br /&gt;
block:&lt;br /&gt;
&lt;br /&gt;
    if ( shape-&amp;gt;curve != NULL ) {&lt;br /&gt;
        NArtBpath *abp = sp_curve_first_bpath(shape-&amp;gt;curve);&lt;br /&gt;
        if (abp) {&lt;br /&gt;
            gchar *str = sp_svg_write_path(abp);&lt;br /&gt;
            sp_repr_set_attr(repr, &amp;quot;d&amp;quot;, str);&lt;br /&gt;
            g_free(str);&lt;br /&gt;
        } else {&lt;br /&gt;
            sp_repr_set_attr(repr, &amp;quot;d&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    } else {&lt;br /&gt;
        sp_repr_set_attr(repr, &amp;quot;d&amp;quot;, NULL);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
but for path-&amp;gt;original_curve and the inkscape:original-d&lt;br /&gt;
attribute, and you are all set.&lt;br /&gt;
&lt;br /&gt;
For shapes, again, nothing needs to be done. Except for rects,&lt;br /&gt;
shapes' _write methods (e.g. sp_star_write) create &amp;lt;path&amp;gt; element&lt;br /&gt;
and set its d= from the SPShape curve. This is just what we need.&lt;br /&gt;
&lt;br /&gt;
That is all - as you see, it's all quite simple, logical and fits&lt;br /&gt;
neatly. There will be gotchas of course, but overall the system&lt;br /&gt;
looks quite straightforward and robust. I'm really excited by&lt;br /&gt;
this.&lt;/div&gt;</summary>
		<author><name>Acspike</name></author>
	</entry>
</feed>