- From: SVG Working Group repository <cam+svgwgrepo@mcc.id.au>
- Date: Thu, 21 Aug 2014 14:08:04 -0700
- To: public-svg-wg@w3.org
details: https://svgwg.org/hg/svg2/rev/100a7b69c1e3
branches:
changeset: 694:100a7b69c1e3
user: Cameron McCormack <cam@mcc.id.au>
date: Fri Aug 22 07:05:40 2014 +1000
description:
Add an Catmull-Rom curve path data command.
diffstat:
master/changes.html | 2 +
master/paths.html | 72 +++++++++++++++++++++++++++++++++++++++++++-
master/style/default_svg.css | 3 +-
3 files changed, 75 insertions(+), 2 deletions(-)
diffs (182 lines):
diff --git a/master/changes.html b/master/changes.html
--- a/master/changes.html
+++ b/master/changes.html
@@ -165,16 +165,18 @@ have been made.</p>
</ul>
<h3 id="paths">Paths chapter</h3>
<ul>
<li>Added new <strong>B</strong> and
<strong>b</strong> "bearing" path commands.</li>
+ <li>Added new <strong>R</strong> and <strong>r</strong> Catmull-Rom curve commands.</li>
+
<li class='added-since-last-wd'>Define <a>'path'</a>, <a>'polygon'</a> and <a>'polyline'</a> elements with no data set (empty or zero valid commands) to not render.</li>
<li class='added-since-last-wd'>Define how <a href="paths.html#__svg__SVGPathElement__getPathSegAtLength">getPathSegAtLength</a> and
<a href="paths.html#__svg__SVGPathElement__getPointAtLength">getPointAtLength</a> handle out-of-range input, and what to do in case there's no valid path data.</li>
</ul>
<h3 id="text">Text chapter</h3>
diff --git a/master/paths.html b/master/paths.html
--- a/master/paths.html
+++ b/master/paths.html
@@ -789,16 +789,81 @@ src="images/paths/arcs02.png" width="426
<p class="view-as-svg"><a href="images/paths/arcs02.svg">View
this example as SVG (SVG-enabled browsers only)</a></p>
<p>Refer to <a
href="implnote.html#ArcImplementationNotes">Elliptical arc
implementation notes</a> for detailed implementation notes for
the path data elliptical arc commands.</p>
+<h3 id="PathDataCatmullRomCommand">The Catmull-Rom curve commands</h3>
+
+<p>The Catmull-Rom curve commands (<strong>R</strong> or <strong>r</strong>)
+specify control points for a Catmull-Rom curve. The Catmull-Rom curve
+commands are:</p>
+
+<table class="PathDataTable">
+ <tr>
+ <th>Command</th>
+ <th>Name</th>
+ <th>Parameters</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td><strong>R</strong> (absolute)<br/>
+ <strong>r</strong> (relative)</td>
+ <td>Catmull-Rom</td>
+ <td>x1 y1 x2 y2 (x y)+</td>
+ <td><p>Draws a Catmull-Rom curve using the specified points as its
+ control points. The curve is drawn starting from (x1, y1),
+ passing through each subsequent point, before stopping at
+ the second-last point given. The current point preceding the command
+ provides the first control point of the curve and controls its tangent
+ coming out of (x1, y1). The final point of the command
+ provides the final control point and controls the tangent
+ of the curve coming in to the second-last point.
+ <strong>R</strong> (uppercase) indicates that absolute coordinates
+ will follows; <strong>r</strong> (lowercase) indicates that
+ relative coordinates will follow.</p>
+ <p>The current point after drawing the Catmull-Rom curve
+ is left at the second-last point of the command, i.e. the point
+ at which the curve ends visually.</p></td>
+ </tr>
+</table>
+
+<p>When a relative <strong>r</strong>
+command is used, each of the relative coordinate pairs
+is computed as for those in an <strong>m</strong> command.
+For example, the second control point of the curve – the first
+listed in the command – is (<var>cpx</var> + <var>x1</var> cos <var>cb</var>
++ <var>y1</var> sin <var>cb</var>, <var>cpy</var> +
+<var>x1</var> sin <var>cb</var> + <var>y1</var> cos <var>cb</var>).</p>
+
+<p class="issue">Should we broaden this and allow for a tension parameter
+to be specified, and thus be cardinal spline rather than a Catmull-Rom spline?</p>
+
+<p class="issue">Should we allow for fewer than three coordinate pair arguments
+to the command and try to do something sensible with them, rather than causing
+the path data to become invalid?</p>
+
+<p class="issue">Is it a problem that the command will move then pen from the current
+position to (x1, y1) without drawing anything? If so, should we made the
+first control point explicit in the command rather than implicitly taken
+from the current position? That would then mirror the behavior written
+above for how the current position is left at the second-last control
+point.</p>
+
+<p class="issue">Where should we link to for a definition of Catmull-Rom
+curves so that we don't have to redefine them here?</p>
+
+<p class="issue">We should clarify what it means to have two consecutive
+<strong>R</strong> or <strong>r</strong> commands.</p>
+
+<p class="issue">We should add an example.</p>
+
<div class="ready-for-wider-review">
<h3 id="PathDataBearingCommands">The bearing commands</h3>
<p>The bearing commands (<strong>B</strong> or <strong>b</strong>)
set the current bearing, which influences the orientation of
subsequent relative path commands:</p>
@@ -900,16 +965,17 @@ drawto-command:
closepath
| lineto
| horizontal-lineto
| vertical-lineto
| curveto
| smooth-curveto
| quadratic-bezier-curveto
| smooth-quadratic-bezier-curveto
+ | catmull-rom
| elliptical-arc
| bearing
moveto:
( "M" | "m" ) <a>wsp</a>* moveto-argument-sequence
moveto-argument-sequence:
coordinate-pair
| coordinate-pair <a>comma-wsp</a>? lineto-argument-sequence
closepath:
@@ -959,18 +1025,22 @@ smooth-quadratic-bezier-curveto-argument
elliptical-arc:
( "A" | "a" ) <a>wsp</a>* elliptical-arc-argument-sequence
elliptical-arc-argument-sequence:
elliptical-arc-argument
| elliptical-arc-argument <a>comma-wsp</a>? elliptical-arc-argument-sequence
elliptical-arc-argument:
number <a>comma-wsp</a>? number <a>comma-wsp</a>?
number <a>comma-wsp</a> flag <a>comma-wsp</a>? flag <a>comma-wsp</a>? coordinate-pair
+catmull-rom:
+ ( "R" | "r" ) <a>wsp</a>* catmull-rom-argument-sequence
+catmull-rom-argument-sequence:
+ coordinate-pair coordinate-pair coordinate-pair+
bearing:
- ( "B" | "b") <a>wsp</a>* bearing-argument-sequence
+ ( "B" | "b" ) <a>wsp</a>* bearing-argument-sequence
bearing-argument-sequence:
number
| number <a>comma-wsp</a>? bearing-argument-sequence
coordinate-pair:
coordinate <a>comma-wsp</a>? coordinate
coordinate:
number
nonnegative-number:
diff --git a/master/style/default_svg.css b/master/style/default_svg.css
--- a/master/style/default_svg.css
+++ b/master/style/default_svg.css
@@ -345,16 +345,17 @@ table.attrtable tbody td:first-child { w
.attrtable tbody td, .attrtable tbody th { vertical-align: baseline }
.attrtable thead th:first-child + th, .attrtable tbody th + td { text-align: left }
table > caption { caption-side: bottom }
table.PathDataTable { border-spacing: 2px; border-style: outset; border-width: 1px }
table.PathDataTable td,
table.PathDataTable th { padding: 5px; border-style: inset; border-width: 1px }
+table.PathDataTable td > p:first-child { margin-top: 0; }
.colorpatch { width: 14px; height: 14px; border: 1px solid black; }
.eltdef { border-left: 0.5em solid #52A7E0 !important; background: #E9F4FB !important; }
.eltdef td > p:first-child { margin-top: 0 }
.eltdef th { white-space: nowrap }
.eltdef pre.idl { margin: 0; padding: 0; background: none }
@@ -473,9 +474,9 @@ a.self-link {
}
a.self-link:hover {
opacity: 1;
}
.heading > a.self-link {
font-size: 83%;
}
-.heading > a.self-link::before { content: "§"; }
\ No newline at end of file
+.heading > a.self-link::before { content: "§"; }
Received on Thursday, 21 August 2014 21:08:31 UTC