64 lines
2.6 KiB
Markdown
64 lines
2.6 KiB
Markdown
# TinySDF [](https://github.com/mourner/projects) [](https://github.com/mapbox/tiny-sdf/actions/workflows/node.yml)
|
||
|
||
TinySDF is a tiny and fast JavaScript library for generating SDF (signed distance field)
|
||
from system fonts on the browser using Canvas 2D and
|
||
[Felzenszwalb/Huttenlocher distance transform](https://cs.brown.edu/~pff/papers/dt-final.pdf).
|
||
This is very useful for [rendering text with WebGL](https://www.mapbox.com/blog/text-signed-distance-fields/).
|
||
|
||
## [Demo](http://mapbox.github.io/tiny-sdf)
|
||
|
||
## Usage
|
||
|
||
Create a TinySDF for drawing glyph SDFs based on font parameters:
|
||
|
||
```js
|
||
const tinySdf = new TinySDF({
|
||
fontSize: 24, // Font size in pixels
|
||
fontFamily: 'sans-serif', // CSS font-family
|
||
fontWeight: 'normal', // CSS font-weight
|
||
fontStyle: 'normal', // CSS font-style
|
||
buffer: 3, // Whitespace buffer around a glyph in pixels
|
||
radius: 8, // How many pixels around the glyph shape to use for encoding distance
|
||
cutoff: 0.25 // How much of the radius (relative) is used for the inside part of the glyph
|
||
});
|
||
|
||
const glyph = tinySdf.draw('泽'); // draw a single character
|
||
```
|
||
|
||
Returns an object with the following properties:
|
||
|
||
- `data` is a `Uint8ClampedArray` array of alpha values (0–255) for a `width` x `height` grid.
|
||
- `width`: Width of the returned bitmap.
|
||
- `height`: Height of the returned bitmap.
|
||
- `glyphTop`: Maximum ascent of the glyph from alphabetic baseline.
|
||
- `glyphLeft`: Currently hardwired to 0 (actual glyph differences are encoded in the rasterization).
|
||
- `glyphWidth`: Width of the rasterized portion of the glyph.
|
||
- `glyphHeight` Height of the rasterized portion of the glyph.
|
||
- `glyphAdvance`: Layout advance.
|
||
|
||
TinySDF is provided as a ES module, so it's only supported on modern browsers, excluding IE.
|
||
|
||
```html
|
||
<script type="module">
|
||
import TinySDF from 'https://cdn.skypack.dev/@mapbox/tiny-sdf';
|
||
...
|
||
</script>
|
||
```
|
||
|
||
In Node, you can't use `require` — only `import` in ESM-capable versions (v12.15+):
|
||
|
||
```js
|
||
import TinySDF from '@mapbox/tiny-sdf';
|
||
```
|
||
|
||
## Development
|
||
|
||
```bash
|
||
npm test # run tests
|
||
npm start # start server for the demo page
|
||
```
|
||
|
||
## License
|
||
|
||
This implementation is licensed under the [BSD 2-Clause license](https://opensource.org/licenses/BSD-2-Clause). It's based directly on the algorithm published in the Felzenszwalb/Huttenlocher paper, and is not a port of the existing C++ implementation provided by the paper's authors.
|