Commit Graph

1746 Commits

Author SHA1 Message Date
Patrick Walton 9d93cebca6 Stop using multiple render targets.
We don't need them anymore, so let's lower our hardware requirements!
2017-10-20 22:04:53 -07:00
Patrick Walton 048c261f6c Add a working experimental implementation of XCAA for SVG.
This has known performance problems and artefacts due to working at
sample level only, but it's a decent first cut.
2017-10-20 19:41:18 -07:00
Patrick Walton 9c470e77c1 Make macOS font rendering not depend on FreeType 2017-10-20 12:10:57 -07:00
Patrick Walton a523d71e3c Stop leaking buffer textures 2017-10-18 19:47:44 -07:00
Patrick Walton 03b4ec2cc6 Stop leaking VAOs 2017-10-18 19:16:56 -07:00
Patrick Walton 70201bb29c Draw distant glyphs as prerendered images in the 3D demo.
This has known performance problems, but it's a good first cut.
2017-10-18 16:19:19 -07:00
Patrick Walton 024b00e479 Decouple text renderers from the text demo's layout 2017-10-17 13:37:36 -07:00
Patrick Walton d66bff9768 Remove useless null check 2017-10-17 12:11:49 -07:00
Patrick Walton 32de1d3441 Decouple text renderers from HTML canvas elements.
This allows for offscreen rendering of text.
2017-10-17 12:10:20 -07:00
Patrick Walton 562851fd6e Lint against long lines 2017-10-17 11:58:03 -07:00
Patrick Walton 9278a4e0e3 Move the text rendering and atlas code out of the text demo so that it
can be reused elsewhere
2017-10-17 11:54:13 -07:00
Patrick Walton 03ee672787 Separate the GPU rendering component of views from the view objects
themselves in the demo.

This (mostly) enables rendering outside a view.
2017-10-16 22:26:25 -07:00
Patrick Walton 976b924842 Decouple mesh-specific data from GL-context-wide data in the demo 2017-10-16 16:48:02 -07:00
Patrick Walton 81787f4750 Remove `MonochromeDemoView` 2017-10-16 16:11:00 -07:00
Patrick Walton 7a0ade99e2 Support subpixel AA in the benchmark 2017-10-16 16:08:05 -07:00
Patrick Walton 30356400fd Merge pull request #35 from Bobo1239/master
Fix demo client compilation on Windows
2017-10-16 15:04:00 -07:00
Patrick Walton cc16158a91 Decouple antialiasing strategies from views in the demo 2017-10-16 13:36:22 -07:00
Patrick Walton d8713f214c Use the Rust benchmarking algorithm for less noisy results 2017-10-15 14:37:44 -07:00
Boris-Chengbiao Zhou dec99769f1 Fix demo client compilation on Windows 2017-10-15 23:23:09 +02:00
Patrick Walton 314185684c Implement stem darkening and split ECAA into ECAA and MCAA.
We now implement stem darkening (also known as font dilation) like
macOS and FreeType under certain configurations. This pushes out font
outlines along their normals slightly in order to make small text easier
to read. This is especially important when performing gamma correction,
as otherwise text can end up too light.

Because the stem darkening is implemented in the vertex shader, it can
easily break the mesh. Therefore, I needed to implement a new rendering
mode that does not use the mesh. It's a variant of ECAA, and for
clarity's sake I've renamed the related antialiasing methods:

* MCAA stands for "mesh coverage antialiasing" and is the new name for
what was called "ECAA" prior to this patch.

* ECAA now stands for "edge coverage antialiasing". It does not use the
mesh but rather computes winding numbers from scratch for every pixel.
Surprisingly, despite being worse asymptotically, this usually ends up
being faster than MCAA at small font sizes, presumably because there are
fewer vertices to transform.

* XCAA, "exact coverage antialiasing" is a generic term that refers to
both ECAA and MCAA. References to ECAA have been changed to XCAA as
needed.
2017-10-15 13:28:49 -07:00
Patrick Walton 3352f869f0 Remove Pathfinder 1 now that Pathfinder 2 supports all its features and
more
2017-10-06 20:03:59 -07:00
Patrick Walton c8284e18b2 Mention advanced font rendering features 2017-10-06 20:03:18 -07:00
Patrick Walton c2368bb71e Rewrite the README.
Closes #26.
2017-10-06 19:55:28 -07:00
Patrick Walton 1846ebd861 Use sRGB color textures where available 2017-10-06 19:18:34 -07:00
Patrick Walton 2a236319d4 Use regular VBOs instead of textures to store vertex positions for ECAA.
This improves performance at small font sizes a bit by reducing vertex
shading load.
2017-10-06 16:42:51 -07:00
Patrick Walton 6a7c013e61 Make the hints a uniform instead of a buffer texture.
Saves a good bit of memory traffic during vertex shading.
2017-10-05 19:14:52 -07:00
Patrick Walton 28837f72a6 Fetch and transform fewer vertices in the ECAA cover shader 2017-10-05 13:30:32 -07:00
Patrick Walton d4c7fa74bd Add a feature to save benchmark data as CSV 2017-10-05 11:46:53 -07:00
Patrick Walton b6a60ef987 Make FreeType no longer a dependency of `path-utils` 2017-10-04 19:03:38 -07:00
Patrick Walton 8de1970682 Implement stroking ourselves, and rename `PathSegment` to `PathCommand`.
This makes Pathfinder no longer use the FreeType stroker.
2017-10-04 18:57:30 -07:00
Patrick Walton 22d0eb7b24 Fix file headers in shaders/ 2017-10-03 15:32:03 -07:00
Patrick Walton 157292175b Use instanced rendering in the 3D demo.
This massively decreases the load time and memory usage in exchange for more draw calls.
2017-10-03 15:24:56 -07:00
Patrick Walton b631fec80f Cache font mesh libraries on the server 2017-10-02 19:58:38 -07:00
Patrick Walton 7bbd02ed85 Send mesh libraries to the client in raw binary instead of Base64 and JSON 2017-10-02 16:31:54 -07:00
Patrick Walton 0bbcf8f1a0 Stop sending path index ranges to the demo client.
They're unused.
2017-10-02 15:50:34 -07:00
Patrick Walton fed528025d Stop sending glyph metadata to the demo client.
It's unused.
2017-10-02 15:45:56 -07:00
Patrick Walton 092b46e056 Reenable early Z optimizations 2017-10-02 15:36:39 -07:00
Patrick Walton f3f893302a Introduce a simple file format for serializing meshes, and use it in the demo 2017-10-02 15:17:21 -07:00
Patrick Walton 475f5dca71 Introduce a new mesh library abstraction for holding meshes.
Simplifies the server code and allows avoiding copying indices all the time.

Closes #29.
2017-10-02 14:03:56 -07:00
Patrick Walton 8c6110a388 Remove the duplicated de Casteljau subdivision code in
`partitioner::geometry`
2017-10-02 11:45:34 -07:00
Patrick Walton 705274997d Remove the now-obsolete path legalizer 2017-10-02 11:40:11 -07:00
Patrick Walton 60ff71be84 Add an experimental implementation of macOS-like font dilation
Following Apple's earlier terminology, this is exposed as "strong"
subpixel AA.
2017-09-29 22:12:24 -07:00
Patrick Walton 99f6f2a104 Snap stems up to the nearest pixel when hinting 2017-09-29 18:02:33 -07:00
Patrick Walton 190c9fb35f Tweak the maximum and minimum zoom parameters for the text demo 2017-09-29 17:00:34 -07:00
Patrick Walton e78d7ed575 Recursively approximate cubic Béziers with quadratics to an error bound.
Gets the tiger rendering properly, as far as I can tell.
2017-09-29 16:30:17 -07:00
Patrick Walton 613bc7c29d Don't start subdividing active edges until we're sure an entire B-quad
will be emitted.

Otherwise it messes up the parity.

Fixes the bottom curve of the lowercase "p" in Open Sans when rendered
with Loop-Blinn.
2017-09-29 13:25:19 -07:00
Patrick Walton 08b9afdca9 Implement subpixel glyph positioning in the text demo 2017-09-29 11:58:16 -07:00
Patrick Walton 7e4308d52e Key glyphs in the atlas off "glyph keys" rather than raw glyph IDs 2017-09-28 16:02:08 -07:00
Patrick Walton 37a88dfcd9 Use the Inter UI font in the demo 2017-09-28 15:23:52 -07:00
Patrick Walton e8135fbfe0 TSLint the demo 2017-09-28 14:34:48 -07:00
Patrick Walton 6217577674 Stop generating so much garbage during mesh expansion.
Avoids a slow script dialog in the 3D demo.
2017-09-28 10:47:16 -07:00
Patrick Walton 1675944dfb Rewrite the text run and glyph store classes for simplicity 2017-09-28 09:48:05 -07:00
Patrick Walton 17b34685a1 Factor mesh expansion out of the glyph store 2017-09-26 18:55:47 -07:00
Patrick Walton b6c6c70ef0 Benchmark the server-side partitioning 2017-09-26 15:38:50 -07:00
Patrick Walton 7f84e98e6e Avoid a bit of code duplication in `ECAAStrategy` 2017-09-26 13:35:41 -07:00
Patrick Walton 70ab2d55f3 Don't count resolution time in the benchmark.
This means that users of Pathfinder will have to accept floating point
textures in order to get the advertised performance, but as they're well
supported on all modern GPUs I don't consider that much of a problem.
2017-09-26 13:35:03 -07:00
Patrick Walton 6b0c215148 Get ECAA working in the benchmark 2017-09-26 13:32:22 -07:00
Patrick Walton 1c138cc543 Display benchmark results in a dialog box instead of on the console 2017-09-25 19:56:12 -07:00
Patrick Walton c37fd1f1e8 Ignore intersections beyond the sweep line.
Improves the outer stroke of the tiger.
2017-09-25 19:15:36 -07:00
Patrick Walton 93de8383f9 Replace the implicitization algorithm for curve intersection with a
simpler one based on binary search and the quadratic formula.

This does a better job avoiding floating point error and improves the
rendering of the tiger.
2017-09-25 18:51:02 -07:00
Patrick Walton 2a906569e5 Emit B-quads around both self-intersecting active edges.
Improves one of the whiskers in the tiger.
2017-09-25 12:58:42 -07:00
Patrick Walton 3efca89235 Don't call `Font.toArrayBuffer()` in the mesh debugger, as that's really slow 2017-09-24 11:49:15 -07:00
Patrick Walton 2197896c4f Keep the camera and view in a sensible state when changing fonts in the text demo 2017-09-23 13:09:45 -07:00
Patrick Walton db32009d7b Create fewer useless B-vertices 2017-09-22 19:15:58 -07:00
Patrick Walton 8c518deebe Do a better job of approximating cubic Bézier curves with quadratics
This still isn't great, but it's a lot better than the old approximation, which was just bogus.
2017-09-22 17:15:19 -07:00
Patrick Walton 2039051f01 Remove bogus fast path that tried to avoid active edge order calculation.
It was causing us to miss a bunch of crossings in the tiger whiskers.
2017-09-22 13:42:20 -07:00
Patrick Walton 88f1d3f108 Fix de Casteljau subdivision when a curve has two inflection points 2017-09-22 13:40:41 -07:00
Patrick Walton be1b100826 Split B-quads whose curves' convex hulls intersect in most cases.
Avoids some rendering artefacts with Loop-Blinn, improving the tiger.
2017-09-21 22:47:00 -07:00
Patrick Walton a126e1248e Don't structure fills around the even-odd rule.
Improves self-intersecting paths under the winding rule.
2017-09-21 14:54:04 -07:00
Patrick Walton 4ac11e9010 Switch to a more robust intersection algorithm based on implicitization 2017-09-20 21:23:56 -07:00
Patrick Walton dafb18fd1d Allow custom SVGs to be opened in the mesh debugger 2017-09-20 12:01:46 -07:00
Patrick Walton b732878532 Encapsulate the file picker code into a view class.
This will allow the mesh debugger to use it.
2017-09-20 11:51:20 -07:00
Patrick Walton 914179763d Improve the mesh debugger in various ways 2017-09-19 22:27:31 -07:00
Patrick Walton 0e9a59088c Implement bare-bones support for debugging SVG meshes 2017-09-19 20:19:53 -07:00
Patrick Walton e7a6861846 Factor the SVG loading functionality out of the SVG demo.
This allows the mesh debugger to use it.
2017-09-19 18:04:42 -07:00
Patrick Walton a5b0e9bf9a Allow different glyphs to be selected in the mesh debugger 2017-09-19 17:36:12 -07:00
Patrick Walton b1cf4b9760 Merge pull request #32 from Manishearth/wasd
demo/client: Make WASD composable
2017-09-19 16:35:25 -07:00
Manish Goregaokar 9a0fa96d4f
demo/client: Make WASD composable
Currently movement works in the direction of the latest key pressed.
Moving diagonally is not possible, and if you are pressing two keys
and release one, movement stops instead of switching over.

This keeps track of the key press state and updates the movement delta
accordingly, leading to much more natural/pleasant WASD navigation.

Note than onKeyDown is called multiple times when you press and hold,
so we must keep track of this state ourselves.
2017-09-19 16:34:41 -07:00
Patrick Walton 83cfb1d9d5 Make glyphs transparent.
Avoids cutting off the bottom of the "g" in the text demo.
2017-09-19 13:57:56 -07:00
Patrick Walton 72d9ad7de0 Handle path self intersection 2017-09-19 11:43:39 -07:00
Patrick Walton 22d2a6590b Blend when compositing in the text demo 2017-09-19 11:42:37 -07:00
Patrick Walton d644f1b6a6 Implement curve-curve and curve-line intersection, untested as of yet 2017-09-18 21:00:34 -07:00
Patrick Walton dbd83d17ef Implement the winding fill rule for real 2017-09-18 15:34:36 -07:00
Patrick Walton e5f9b56a1d Implement the winding fill rule 2017-09-18 14:19:28 -07:00
Patrick Walton 820c4bec18 Round canvas sizes to properly handle fractional device pixel ratios.
Fixes nasty artefacts seen on Windows HiDPI screens with certain system settings.
2017-09-17 10:06:53 -07:00
Patrick Walton 45927f6299 Add a CSS spinner to the HTML templates.
This will allow us to make loading a nicer experience.

Source: http://tobiasahlin.com/spinkit/
2017-09-16 10:41:25 -07:00
Patrick Walton 5d267cc2c8 Take the xMin/left values of the glyphs' bounds into account when determining their pixel rects.
This prevents glyph images from "bleeding" into each other horizontally.
2017-09-15 15:57:32 -04:00
Patrick Walton 375dbe7ab9 Make sure scrollbars don't show up on demo and tool pages 2017-09-15 09:40:26 -07:00
Patrick Walton 445d00fed3 Prevent the user from flipping the camera upside down in the 3D view 2017-09-15 09:31:19 -07:00
Patrick Walton 82f876c4ff Take `WheelEvent.deltaMode` into account when panning 2017-09-15 09:22:56 -07:00
Patrick Walton a5d0df6a96 Implement simple collision detection in the 3D demo 2017-09-14 18:48:55 -07:00
Patrick Walton b48b256ab3 Actually reverse indices for early Z!
2x performance improvement. I feel silly.
2017-09-14 17:20:54 -07:00
Patrick Walton 42151cc334 Fix text positioning and improve performance in the 3D demo.
This implements a simple form of software backface culling to reduce vertex shading load.
2017-09-14 15:16:06 -07:00
Patrick Walton 0087c1ed50 Add SSAA support to the benchmarking tool 2017-09-13 21:41:33 -07:00
Patrick Walton 299bcd685e Fix scaling of the benchmark 2017-09-13 21:03:10 -07:00
Patrick Walton adf960bafe Make the GitHub corner stay in place when zooming and not widen the pages 2017-09-13 20:59:19 -07:00
Patrick Walton 8b34fa5461 Enable SSAA by default in the SVG demo 2017-09-13 20:45:48 -07:00
Patrick Walton a21afa9bb7 Fix the interaction between the camera and SSAA in the SVG demo 2017-09-13 20:41:04 -07:00
Patrick Walton 5c45b6f94e Prevent the user from scrolling the text out of view 2017-09-13 18:39:19 -07:00
Patrick Walton 6642cc7aa4 Limit how far the user can zoom the camera out 2017-09-13 13:30:26 -07:00