[whatwg] Dashed strokes on <canvas>
David Flanagan
david at davidflanagan.com
Wed May 9 15:33:51 PDT 2007
Philip,
You have a reasonable point. I still think that an implementation would
be trivial, but you're right that there is more complexity for the
specification than simply defining one more method API. On the other
hand, I think it is legitimate to take the SVG-Tiny route and leave
specific rendering details to the implementation. After all, you're not
specifying line and curve drawing algorithms down to the pixel, are you?
> There are other missing features that people are actively implementing
> workarounds for, like drawing text, which is a good indicator of
> demand. Are there examples where people are currently fighting against
> the lack of dashed lines?
The problem of layering text on top of a canvas is a solvable one, so
people are solving it. I don't think that dashed lines can really be
worked around. If there is no native support, they're not worth doing.
To me the killer use-case for dashed lines is this: displaying multiple
data series in a line chart that will be printed in black-and-white.
People have been using dashed lines for that since Rene Descartes
invented the coordinate system!
I come to this from an admittedly theoretical perspective, but the need
for dashed lines just seems self-evident to me. I assume that the
omission of dashed lines was simply an oversight in the original Apple
implementation, and I'm really surprised by the resistance to adding
this from whatwg.
David
Philip Taylor wrote:
> On 09/05/07, David Flanagan <david at davidflanagan.com> wrote:
>> Ian Hickson wrote:
>> > On Wed, 17 May 2006, David Flanagan wrote:
>> >> What surprises me about the omission of dashed lines is that every
>> >> graphics API I'm familiar with (Xlib, PostScript, Java 2D) supports
>> >> dashed lines. Unless there is some important platform out there that
>> >> does not support them in the underlying graphics library, it seems
>> to me
>> >> that it would have been trivial to add dashed lines to the API.
>> >>
>> >> And, I can't think of any simple or efficient way to simulate dashed
>> >> lines without having them in the API. And while dashed lines may
>> not be
>> >> a high-use feature, I wouldn't say they're infrequently used. For
>> >> example: when drawing a line chart with multiple lines which is
>> intended
>> >> to be printed on a black-and-white laser printer.
>> >
>> > There are many styles that aren't supported -- dashes aren't an
>> exception.
>> > For example, there's no support for having defined markers repeated
>> around
>> > the stroke. Similarly, we don't havenative support for rounded
>> corners,
>> > or for many shapes (e.g. circles).
>>
>> Dashes would be trivial to add--it is just a single additional line
>> style property.
>
> I don't think it's entirely trivial to add, to the detail that's
> necessary in a specification. The common graphics APIs (at least
> Cairo, Quartz and java.awt.Graphics, and any SVG implementation) all
> have dashes specified by passing an array of dash lengths (alternating
> on/off), so that should be alright as long as you define what units
> it's measured in and what happens when you specify an odd number of
> values and how errors are handled and what happens if you update the
> array later. But after that, what does it do when stroking multiple
> subpaths, in terms of offsetting the dashes? When you use strokeRect,
> where is offset 0? Does moveTo reset the offset? How does it interact
> with lineCap/lineJoin? All the potential issues need test cases too,
> and the implementations need to make sure they handle any edge cases
> that the underlying graphics library does differently. (SVG Tiny 1.2
> appears to skip some of the problems by leaving things undefined and
> allowing whatever behaviour the graphics library has.)
>
>> > You can do dashed lines using paths.
>>
>> This is true only in theory. Way too much computation is necessary to
>> transform a path into a dashed path.
>
> That's particularly a problem for Bezier curves - decomposing them
> into fixed-length segments in JS wouldn't be any fun. At least it's
> not difficult for straight lines (and someone could write a pure-JS
> canvas extension library to provide that kind of feature), but I have
> no idea how often people want dashed curves compared to dashed lines.
>
>> > Without more demand for this feature,
>> > it's not clear that it's worth us putting it into the language.
>>
>> It is just one more method on CanvasRenderingContext2D. And the
>> implementation would almost certainly be trivial. You'll see the demand
>> for dashed lines when Canvas becomes standardized without it, and people
>> start wondering how to do dashes. It truly seems strange to me that
>> this feature has been omitted.
>
> It's one method plus detailed specification and tests and multiple
> implementations and bugs and documentation - none of those are
> especially difficult, but all the work adds up, so there has to be
> enough justification in order to add a feature.
>
> There are other missing features that people are actively implementing
> workarounds for, like drawing text, which is a good indicator of
> demand. Are there examples where people are currently fighting against
> the lack of dashed lines?
>
> (I think a number of the features already in the spec fail the
> usefulness requirements, or aren't specified to the detail necessary
> for interoperability, but that's not a reason to add more.)
>
>> David Flanagan
>
More information about the whatwg
mailing list