Commit Graph

52 Commits

Author SHA1 Message Date
Patrick Walton 775ee2b526 Add basic native rasterization for Core Graphics and match the WebRender
`FontContext` API more
2017-10-26 17:55:17 -07:00
Patrick Walton 0b179f3a40 Add preliminary DirectWrite support on Windows.
This will eventually need to call into GDI to do hinting, but it's good
enough for now.
2017-10-25 13:01:36 -07:00
Patrick Walton 0a4fcb4841 Add a cubic curve command stream.
This is a prerequisite for handling CFF fonts.
2017-10-23 20:05:36 -07:00
Patrick Walton 9c470e77c1 Make macOS font rendering not depend on FreeType 2017-10-20 12:10:57 -07: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 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 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 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 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 37a88dfcd9 Use the Inter UI font in the demo 2017-09-28 15:23:52 -07:00
Patrick Walton b6c6c70ef0 Benchmark the server-side partitioning 2017-09-26 15:38:50 -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 88f1d3f108 Fix de Casteljau subdivision when a curve has two inflection points 2017-09-22 13:40:41 -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 a7d75f913c Split paths into monotonic segments before partitioning them in the demo 2017-09-12 09:35:57 -07:00
Patrick Walton 068e2bd99e Stub a benchmarking tool, not working yet 2017-09-11 11:22:19 -07:00
Patrick Walton c36896e337 Implement path stroking using the FreeType stroker.
I'm not too happy with this, as I discovered a segfault in FreeType that doesn't give me confidence
in this as a solution for the long term. Additionally, this exposes the problems in the partitioner
with lack of winding fill rule, proper handling of self-intersections, and splitting of paths at
their extrema. (I believe these problems should be fairly straightforward to handle, but we just
don't handle them yet.)
2017-09-08 16:50:27 -07:00
Patrick Walton 3e5b53f13c Partially refactor the path APIs to be streaming, like Lyon 2017-09-08 13:09:00 -07:00
Patrick Walton 6cbc7dc082 Use some names from the Mozilla Monument in the 3D demo 2017-09-06 22:50:07 -07:00
Patrick Walton 2166f9fa07 Reverse Z order of interior elements for early Z 2017-09-06 18:28:23 -07:00
Patrick Walton 444e7bbf96 Use the Citardauq Formula in the partitioner as well as the shader to avoid precision problems.
Addresses the issue with the Nimbus Sans "o" mentioned in #24.
2017-09-01 23:45:51 -07:00
Patrick Walton 632202e5eb Implement a basic mesh debugger 2017-09-01 22:29:05 -07:00
Patrick Walton 1eb1bb5343 Stub a mesh debugger app 2017-09-01 18:11:44 -07:00
Patrick Walton a1013de5ba Expose the Rust API documentation via the server 2017-08-31 19:47:58 -07:00
Patrick Walton e448ba7b30 Switch from ES6 interpolation to Handlebars and add a simple landing page 2017-08-30 23:25:58 -07:00
Patrick Walton d6767219ff Automatically load some built-in fonts and SVGs 2017-08-30 19:48:18 -07:00
Patrick Walton 58b558de64 Make the demo UI less cluttered 2017-08-30 17:01:28 -07:00
Patrick Walton d7b606987a Update to Bootstrap 4 beta 2017-08-30 09:51:15 -07:00
Patrick Walton 7029248610 Stub a 3D demo 2017-08-29 19:46:18 -07:00
Patrick Walton 8d6636b1cf Add `-demo` to the SVG and text demo files 2017-08-29 18:57:43 -07:00
Patrick Walton 40c0e9b8c5 Use ES6 templates to reduce duplication in the demo HTML 2017-08-29 16:04:40 -07:00
Patrick Walton 4d16df17db Implement the server-side support for SVG path partitioning in the demo 2017-08-28 16:47:27 -07:00
Patrick Walton e5f1f3ccfb Remove unused dependency 2017-08-27 12:45:05 -07:00
Patrick Walton 01d1382324 Begin splitting up `index.ts` 2017-08-25 20:20:45 -07:00
Patrick Walton 894226e023 Stub an SVG demo page 2017-08-25 19:40:08 -07:00
Patrick Walton 93277c7c11 Allow multiple glyphs to be rendered simultaneously 2017-08-19 16:34:02 -07:00
Patrick Walton ec78a632dc Split path IDs and Loop-Blinn data into separate VBOs 2017-08-17 12:47:50 -07:00
Patrick Walton 4b62ec8fa7 Get edge detection working in the demo 2017-08-16 16:37:39 -07:00
Patrick Walton f8bd405759 Get basic polygons rendering in the demo 2017-08-14 16:08:45 -07:00
Patrick Walton ee9c1a7998 Download shaders via XHR 2017-08-11 21:26:25 -07:00
Patrick Walton 57ebbf8281 Split out B-vertex positions and info so that they're easier to pack into textures 2017-08-11 15:56:07 -07:00
Patrick Walton fa1b2390c7 Remove bad `extern crate` directive 2017-08-10 21:02:32 -07:00
Patrick Walton 933e4023ed Send mesh indices along to the client as well 2017-08-10 21:00:37 -07:00
Patrick Walton 5b84b052a0 Upload the chosen font to the server 2017-08-10 18:38:54 -07:00
Patrick Walton 0ad2f9abfe Initial implementation of the Rocket-based demo server 2017-08-10 15:26:27 -07:00
Patrick Walton 2ddf95bd70 Initial work on the font renderer component 2017-08-09 15:36:41 -07:00