diff --git a/doc/artwork/line-annotation.svg b/doc/artwork/line-annotation.svg
new file mode 100644
index 000000000..aef5bec22
--- /dev/null
+++ b/doc/artwork/line-annotation.svg
@@ -0,0 +1,331 @@
+
+
+
+
diff --git a/doc/artwork/line-caps.svg b/doc/artwork/line-caps.svg
new file mode 100644
index 000000000..d415d7668
--- /dev/null
+++ b/doc/artwork/line-caps.svg
@@ -0,0 +1,247 @@
+
+
+
+
diff --git a/doc/artwork/line-joins.svg b/doc/artwork/line-joins.svg
new file mode 100644
index 000000000..be32c6614
--- /dev/null
+++ b/doc/artwork/line-joins.svg
@@ -0,0 +1,395 @@
+
+
+
+
diff --git a/doc/artwork/line-quad-data-neighbor.svg b/doc/artwork/line-quad-data-neighbor.svg
new file mode 100644
index 000000000..9e9e95518
--- /dev/null
+++ b/doc/artwork/line-quad-data-neighbor.svg
@@ -0,0 +1,547 @@
+
+
+
+
diff --git a/doc/artwork/line-quad-data-other.svg b/doc/artwork/line-quad-data-other.svg
new file mode 100644
index 000000000..216a341b5
--- /dev/null
+++ b/doc/artwork/line-quad-data-other.svg
@@ -0,0 +1,252 @@
+
+
+
+
diff --git a/doc/artwork/line-quad-data-overlap.svg b/doc/artwork/line-quad-data-overlap.svg
new file mode 100644
index 000000000..2c8a26639
--- /dev/null
+++ b/doc/artwork/line-quad-data-overlap.svg
@@ -0,0 +1,2287 @@
+
+
+
+
diff --git a/doc/artwork/line-quad-data.svg b/doc/artwork/line-quad-data.svg
new file mode 100644
index 000000000..debabf694
--- /dev/null
+++ b/doc/artwork/line-quad-data.svg
@@ -0,0 +1,149 @@
+
+
+
+
diff --git a/doc/artwork/line-quad-expansion.svg b/doc/artwork/line-quad-expansion.svg
new file mode 100644
index 000000000..7a6336afa
--- /dev/null
+++ b/doc/artwork/line-quad-expansion.svg
@@ -0,0 +1,408 @@
+
+
+
+
diff --git a/doc/snippets/MagnumShaders-gl.cpp b/doc/snippets/MagnumShaders-gl.cpp
index 7193089ec..1e72e7353 100644
--- a/doc/snippets/MagnumShaders-gl.cpp
+++ b/doc/snippets/MagnumShaders-gl.cpp
@@ -42,6 +42,7 @@
#include "Magnum/GL/Shader.h"
#include "Magnum/GL/Renderbuffer.h"
#include "Magnum/GL/RenderbufferFormat.h"
+#include "Magnum/GL/Renderer.h"
#include "Magnum/GL/Texture.h"
#include "Magnum/GL/TextureFormat.h"
#include "Magnum/GL/Version.h"
@@ -66,6 +67,8 @@
#include "Magnum/Shaders/DistanceFieldVector.h"
#include "Magnum/Shaders/Flat.h"
#include "Magnum/Shaders/Generic.h"
+#include "Magnum/Shaders/Line.h"
+#include "Magnum/Shaders/LineGL.h"
#include "Magnum/Shaders/MeshVisualizer.h"
#include "Magnum/Shaders/Phong.h"
#include "Magnum/Shaders/Vector.h"
@@ -694,6 +697,67 @@ vert.addSource(Utility::format(
/* [GenericGL-custom-preprocessor] */
}
+#ifndef MAGNUM_TARGET_GLES2
+{
+GL::Mesh mesh;
+Matrix3 transformationMatrix, projectionMatrix;
+/* [LineGL-usage2] */
+Shaders::LineGL2D shader;
+shader
+ .setViewportSize(Vector2{GL::defaultFramebuffer.viewport().size()})
+ .setTransformationProjectionMatrix(projectionMatrix*transformationMatrix)
+ .setColor(0x2f83cc_rgbf)
+ .setWidth(4.0f)
+ .draw(mesh);
+/* [LineGL-usage2] */
+}
+
+{
+GL::Mesh mesh;
+/* [LineGL-usage-antialiasing] */
+GL::Renderer::enable(GL::Renderer::Feature::Blending);
+GL::Renderer::setBlendFunction(
+ GL::Renderer::BlendFunction::One,
+ GL::Renderer::BlendFunction::OneMinusSourceAlpha);
+
+Shaders::LineGL2D shader;
+shader
+ DOXYGEN_ELLIPSIS()
+ .setSmoothness(1.0f)
+ .draw(mesh);
+/* [LineGL-usage-antialiasing] */
+}
+
+{
+GL::Mesh mesh;
+Matrix3 transformationMatrix, projectionMatrix;
+/* [LineGL-ubo] */
+GL::Buffer transformationProjectionUniform, materialUniform, drawUniform;
+transformationProjectionUniform.setData({
+ Shaders::TransformationProjectionUniform2D{}
+ .setTransformationProjectionMatrix(projectionMatrix*transformationMatrix)
+});
+materialUniform.setData({
+ Shaders::LineMaterialUniform{}
+ .setColor(0x2f83cc_rgbf)
+});
+drawUniform.setData({
+ Shaders::LineDrawUniform{}
+ .setMaterialId(0)
+});
+
+Shaders::LineGL2D shader{Shaders::LineGL2D::Configuration{}
+ .setFlags(Shaders::LineGL2D::Flag::UniformBuffers)};
+shader
+ .setViewportSize(Vector2{GL::defaultFramebuffer.viewport().size()})
+ .bindTransformationProjectionBuffer(transformationProjectionUniform)
+ .bindMaterialBuffer(materialUniform)
+ .bindDrawBuffer(drawUniform)
+ .draw(mesh);
+/* [LineGL-ubo] */
+}
+#endif
+
{
GL::Mesh mesh;
/* [MeshVisualizerGL2D-usage-instancing] */
diff --git a/doc/snippets/README.md b/doc/snippets/README.md
index 64477e04d..c886790cd 100644
--- a/doc/snippets/README.md
+++ b/doc/snippets/README.md
@@ -14,13 +14,25 @@ smaller file sizes:
The output printed by the application can be used to update the example output
in `doc/getting-started.dox`.
-### triangulate.svg, scenedata-tree.svg, scenedata-dod.svg
+### triangulate.svg, scenedata-tree.svg, scenedata-dod.svg, line-*.svg
-Created by Inkscape from `doc/artwork/triangulate.svg` by saving as Optimized
-SVG and:
+Created by Inkscape from `doc/artwork/triangulate.svg` and `line-*.svg` by
+saving as Optimized SVG. On fresh installations you need the `scour` package
+for it:
-- cleaning up the `