Skip to content

Commit

Permalink
LibWeb: Initial support for dashed lines in Canvas
Browse files Browse the repository at this point in the history
Implement setLineDash() and getLineDash() in CanvasPathDrawingStyles,
which write/read from the CanvasState object.
This doesn't implement the actual drawing of a dashed line, but at least
sites using the Chart.js library no longer fail with an exception.
Unfortunately the Painter classes don't support dashed/dotted lines
based on segments yet.
  • Loading branch information
simonkrauter authored and awesomekling committed Jun 25, 2024
1 parent c4c91f0 commit e9001da
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 2 deletions.
23 changes: 23 additions & 0 deletions Userland/Libraries/LibWeb/HTML/Canvas/CanvasPathDrawingStyles.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,29 @@ class CanvasPathDrawingStyles {
return my_drawing_state().line_width;
}

// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-setlinedash
void set_line_dash(Vector<double> segments)
{
// 1. If any value in segments is not finite (e.g. an Infinity or a NaN value), or if any value is negative (less than zero), then return (without throwing an exception; user agents could show a message on a developer console, though, as that would be helpful for debugging).
for (auto const& segment : segments) {
if (!isfinite(segment) || segment < 0)
return;
}

// 2. If the number of elements in segments is odd, then let segments be the concatenation of two copies of segments.
if (segments.size() % 2 == 1)
segments.extend(segments);

// 3. Let the object's dash list be segments.
my_drawing_state().dash_list = segments;
}

// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-getlinedash
Vector<double> get_line_dash()
{
return my_drawing_state().dash_list;
}

protected:
CanvasPathDrawingStyles() = default;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ interface mixin CanvasPathDrawingStyles {
[FIXME] attribute CanvasLineJoin lineJoin;
[FIXME] attribute unrestricted double miterLimit;

[FIXME] undefined setLineDash(sequence<unrestricted double> segments);
[FIXME] sequence<unrestricted double> getLineDash();
undefined setLineDash(sequence<unrestricted double> segments);
sequence<unrestricted double> getLineDash();
[FIXME] attribute unrestricted double lineDashOffset;
};
1 change: 1 addition & 0 deletions Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class CanvasState {
FillOrStrokeStyle fill_style { Gfx::Color::Black };
FillOrStrokeStyle stroke_style { Gfx::Color::Black };
float line_width { 1 };
Vector<double> dash_list;
bool image_smoothing_enabled { true };
Bindings::ImageSmoothingQuality image_smoothing_quality { Bindings::ImageSmoothingQuality::Low };
float global_alpha = { 1 };
Expand Down

0 comments on commit e9001da

Please sign in to comment.