Full Code of LearnBoost/node-canvas for AI

master f91598e8c718 cached
124 files
4.2 MB
1.1M tokens
535 symbols
1 requests
Download .txt
Showing preview only (4,387K chars total). Download the full file or copy to clipboard to get everything.
Repository: LearnBoost/node-canvas
Branch: master
Commit: f91598e8c718
Files: 124
Total size: 4.2 MB

Directory structure:
gitextract_xch7c5aw/

├── .github/
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── ci.yaml
│       └── prebuild.yaml
├── .gitignore
├── CHANGELOG.md
├── Readme.md
├── benchmarks/
│   └── run.js
├── binding.gyp
├── browser.js
├── examples/
│   ├── clock.js
│   ├── crop.js
│   ├── fill-evenodd.js
│   ├── font.js
│   ├── globalAlpha.js
│   ├── gradients.js
│   ├── grayscale-image.js
│   ├── image-caption-overlay.js
│   ├── image-src-svg.js
│   ├── image-src-url.js
│   ├── image-src.js
│   ├── indexed-png-alpha.js
│   ├── indexed-png-image-data.js
│   ├── kraken.js
│   ├── live-clock.js
│   ├── multi-page-pdf.js
│   ├── pango-glyphs.js
│   ├── pdf-images.js
│   ├── pdf-link.js
│   ├── pfennigFont/
│   │   ├── FONTLOG.txt
│   │   ├── OFL.txt
│   │   ├── Pfennig.sfd
│   │   ├── PfennigBold.sfd
│   │   ├── PfennigBoldItalic.sfd
│   │   └── PfennigItalic.sfd
│   ├── ray.js
│   ├── resize.js
│   ├── rhill-voronoi-core-min.js
│   ├── small-pdf.js
│   ├── small-svg.js
│   ├── spark.js
│   ├── state.js
│   ├── text.js
│   └── voronoi.js
├── index.d.ts
├── index.js
├── index.test-d.ts
├── lib/
│   ├── DOMMatrix.js
│   ├── bindings.js
│   ├── canvas.js
│   ├── context2d.js
│   ├── image.js
│   ├── jpegstream.js
│   ├── pattern.js
│   ├── pdfstream.js
│   └── pngstream.js
├── package.json
├── src/
│   ├── Backends.h
│   ├── Canvas.cc
│   ├── Canvas.h
│   ├── CanvasError.h
│   ├── CanvasGradient.cc
│   ├── CanvasGradient.h
│   ├── CanvasPattern.cc
│   ├── CanvasPattern.h
│   ├── CanvasRenderingContext2d.cc
│   ├── CanvasRenderingContext2d.h
│   ├── CharData.h
│   ├── FontParser.cc
│   ├── FontParser.h
│   ├── Image.cc
│   ├── Image.h
│   ├── ImageData.cc
│   ├── ImageData.h
│   ├── InstanceData.h
│   ├── JPEGStream.h
│   ├── PNG.h
│   ├── Point.h
│   ├── Util.h
│   ├── bmp/
│   │   ├── BMPParser.cc
│   │   ├── BMPParser.h
│   │   └── LICENSE.md
│   ├── closure.cc
│   ├── closure.h
│   ├── color.cc
│   ├── color.h
│   ├── dll_visibility.h
│   ├── init.cc
│   ├── register_font.cc
│   └── register_font.h
├── test/
│   ├── canvas.test.js
│   ├── dommatrix.test.js
│   ├── fontParser.test.js
│   ├── image.test.js
│   ├── imageData.test.js
│   ├── public/
│   │   ├── app.html
│   │   ├── app.js
│   │   ├── style.css
│   │   └── tests.js
│   ├── server.js
│   └── wpt/
│       ├── drawing-text-to-the-canvas.yaml
│       ├── fill-and-stroke-styles.yaml
│       ├── generate.js
│       ├── generated/
│       │   ├── drawing-text-to-the-canvas.js
│       │   ├── line-styles.js
│       │   ├── meta.js
│       │   ├── path-objects.js
│       │   ├── pixel-manipulation.js
│       │   ├── shadows.js
│       │   ├── text-styles.js
│       │   ├── the-canvas-element.js
│       │   ├── the-canvas-state.js
│       │   └── transformations.js
│       ├── line-styles.yaml
│       ├── meta.yaml
│       ├── path-objects.yaml
│       ├── pixel-manipulation.yaml
│       ├── shadows.yaml
│       ├── text-styles.yaml
│       ├── the-canvas-element.yaml
│       ├── the-canvas-state.yaml
│       └── transformations.yaml
└── util/
    ├── has_lib.js
    └── win_jpeg_lookup.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
## Issue or Feature
- [ ] If this is an issue with installation, I have read the [troubleshooting guide](https://github.com/Automattic/node-canvas/issues/1511).

<!--- Provide info about the bug or feature. -->

## Steps to Reproduce
<!--- For bugs, provide a short, complete code example to reproduce the issue. -->
```js
var Canvas = require('canvas');
var canvas = Canvas.createCanvas(200, 200);
var ctx = canvas.getContext('2d');
// etc.
```

## Your Environment
* Version of node-canvas (output of `npm list canvas` or `yarn list canvas`):
* Environment (e.g. node 20.9.0 on macOS 14.1.1):


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
Thanks for contributing!

- [ ] Have you updated CHANGELOG.md?


================================================
FILE: .github/workflows/ci.yaml
================================================
name: Test
on:
  push:
    paths-ignore:
      - ".github/workflows/prebuild.yaml"
  pull_request:
    paths-ignore:
      - ".github/workflows/prebuild.yaml"

jobs:
  Linux:
    name: Test on Linux
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: [18.20.5, 20.18.1, 22.12.0, 23.3.0, 24.2.0, 25.8.0 ]
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - uses: actions/checkout@v4
      - name: Install Dependencies
        run: |
          sudo apt update
          sudo apt install -y libcairo2-dev libjpeg-dev libpango1.0-dev libgif-dev librsvg2-dev
      - name: Install
        run: npm install --build-from-source
      - name: Test
        run: npm test

  Windows:
    name: Test on Windows
    runs-on: windows-2025
    strategy:
      matrix:
        node: [18.20.5, 20.18.1, 22.12.0, 23.3.0, 24.2.0, 25.8.0 ]
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - uses: actions/checkout@v4
      - name: Install Dependencies
        run: |
          Invoke-WebRequest "https://ftp.gnome.org/pub/GNOME/binaries/win64/gtk+/2.22/gtk+-bundle_2.22.1-20101229_win64.zip" -OutFile "gtk.zip"
          Expand-Archive gtk.zip -DestinationPath "C:\GTK"
          Invoke-WebRequest "https://downloads.sourceforge.net/project/libjpeg-turbo/2.0.4/libjpeg-turbo-2.0.4-vc64.exe" -OutFile "libjpeg.exe" -UserAgent NativeHost
          .\libjpeg.exe /S
          winget install --accept-source-agreements --id=Microsoft.VCRedist.2010.x64 -e
          npm install -g node-gyp@8
          npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"}
      - name: Install
        run: npm install --build-from-source
      - name: Test
        run: npm test

  macOS:
    name: Test on macOS
    runs-on: macos-15
    strategy:
      matrix:
        node: [18.20.5, 20.18.1, 22.12.0, 23.3.0, 24.2.0, 25.8.0 ]
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - uses: actions/checkout@v4
      - name: Install Dependencies
        run: |
          brew update
          brew install python-setuptools pkg-config cairo pango libpng jpeg giflib librsvg
      - name: Install
        run: npm install --build-from-source
      - name: Test
        run: npm test

  Lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: 20.9.0
      - uses: actions/checkout@v4
      - name: Install
        run: npm install --ignore-scripts
      - name: Lint
        run: npm run lint
      - name: Lint Types
        run: npm run tsd


================================================
FILE: .github/workflows/prebuild.yaml
================================================
# This is a dummy file so that this workflow shows up in the Actions tab.
# Prebuilds are actually run using the prebuilds branch.

name: Make Prebuilds
on: workflow_dispatch

jobs:
  Linux:
    name: Nothing
    runs-on: ubuntu-latest
    steps:
      - name: Nothing
        run: echo "Nothing to do here"


================================================
FILE: .gitignore
================================================
build
.DS_Store
.lock-wscript
test/images/*.png
examples/*.png
examples/*.jpg
examples/*.pdf
testing
out.png
out.pdf
out.svg
.pomo
node_modules
package-lock.json

# Vim cruft
*.swp
*.un~
npm-debug.log

.idea


================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/) and this
project adheres to [Semantic Versioning](http://semver.org/).

(Unreleased)
==================
### Changed
### Added
### Fixed

3.2.3
==================
### Fixed
* Fix building with gcc (#2559)

3.2.2
==================
### Fixed
* Fix dangling env pointer in image MIME data cleanup (#2550)
* Fix `ctx.direction` not affected by `ctx.save` and `ctx.restore`
* Preserve rest of PDF pages when changing width and height (#2538)
* Several security fixes for untrusted inputs to getImageData and putImageData. Thanks to Ethan Kim for the report.

3.2.1
==================
* Fix error message HTTP response status code in image src setter
* `roundRect()` shape incorrect when radii were large relative to rectangle size (#2400)
* Reject loadImage when src is null or invalid (#2304)
* Fix compilation on GCC 15 by including <cstdint> (#2545)

3.2.0
==================
### Added
* Added `ctx.lang` to set the ISO language code for text

3.1.2
==================
### Fixed
* Fix crash when setting width/height on PDF, SVG canvas (#2520)

3.1.1
==================
### Fixed
* Fix a crash when SVGs without width or height are loaded (#2486)
* Fix fetching prebuilds during installation on certain newer versions of Node (#2497)
* Fixed issue with fillText that was breaking subsequent fillText calls (#2171)
* Fix svg rendering when the image is resized (#2498)
* Fix measureText with direction rtl textAlign start/end
* Fix a crash in Node 24, due to external memory API change (#2514)

3.1.0
==================
### Changed
* Replaced `simple-get ` with ` Node.js builtin` `fetch` (#2309)
* `ctx.font` has a new C++ parser and is 2x-400x faster. Please file an issue if you experience different results, as caching has been removed.
* The restriction of registering fonts before a canvas is created has been removed. You can now register a font as late as right before the `fillText` call ([#1921](https://github.com/Automattic/node-canvas/issues/1921))

### Added
* Support for accessibility and links in PDFs
* `ctx.direction` is implemented: `'rtl'` or `'ltr'` set the base direction of text
* `ctx.textAlign` `'start'` and `'end'` are now `'right'` and `'left'` when `ctx.direction === 'rtl'`

### Fixed
* Fix a crash in `getImageData` when the rectangle is entirely outside the canvas. ([#2024](https://github.com/Automattic/node-canvas/issues/2024))
* Fix `getImageData` cropping the resulting `ImageData` when the given rectangle is partly outside the canvas. ([#1849](https://github.com/Automattic/node-canvas/issues/1849))

3.0.1
==================
### Fixed
* Fixed accidental depenency on ambient DOM types

3.0.0
==================

This release notably changes to using N-API. 🎉

### Breaking
* Dropped support for Node.js 16.x and below.
### Changed
* Migrated to N-API (by way of node-addon-api) and removed libuv and v8 dependencies
* Change from node-pre-gyp to prebuild-install
* Defer the initialization of the `op` variable to the `default` switch case to avoid a compiler warning. (#2229)
* Use a `default` switch case with a null statement if some enum values aren't suppsed to be handled, this avoids a compiler warning. (#2229)
* Migrate from librsvg's deprecated `rsvg_handle_get_dimensions()` and `rsvg_handle_render_cairo()` functions to the new `rsvg_handle_get_intrinsic_size_in_pixels()` and `rsvg_handle_render_document()` respectively. (#2229)
* Avoid calling virtual methods in constructors/destructors to avoid bypassing virtual dispatch. (#2229)
* Remove unused private field `backend` in the `Backend` class. (#2229)
* Add Node.js v20 to CI. (#2237)
* Replaced `dtslint` with `tsd` (#2313)
* Changed PNG consts to static properties of Canvas class
* Reverted improved font matching on Linux (#1572) because it doesn't work if fonts are installed. If you experience degraded font selection, please file an issue and use v3.0.0-rc3 in the meantime.

### Added
* Added string tags to support class detection
* Throw Cairo errors in canvas.toBuffer()
### Fixed
* Fix a case of use-after-free. (#2229)
* Fix usage of garbage value by filling the allocated memory entirely with zeros if it's not modified. (#2229)
* Fix a potential memory leak. (#2229)
* Fix the wrong type of setTransform
* Fix the improper parsing of rgb functions issue. (#2300)
* Fix issue related to improper parsing of leading and trailing whitespaces in CSS color. (#2301)
* RGB functions should support real numbers now instead of just integers. (#2339)
* Allow alternate or properly escaped quotes *within* font-family names
* Fix TextMetrics type to include alphabeticBaseline, emHeightAscent, and emHeightDescent properties
* Fix class properties should have defaults as standard js classes (#2390)
* Fixed Exif orientation in JPEG files being ignored (#1670)
* Align DOMMatrix/DOMPoint to spec by adding missing methods

2.11.2
==================
### Fixed
* Building on Windows in CI (and maybe other Windows configurations?) (#2216)

2.11.1
==================
### Fixed
* Add missing property `canvas` to the `CanvasRenderingContext2D` type
* Fixed glyph positions getting rounded, resulting text having a slight `letter-spacing` effect
* Fixed `ctx.font` not being restored correctly after `ctx.restore()` (#1946)

2.11.0
==================
### Fixed
* Replace triple-slash directive in types with own types to avoid polluting TS modules with globals ([#1656](https://github.com/Automattic/node-canvas/issues/1656))

2.10.2
==================
### Fixed
* Fix `Assertion failed: (object->InternalFieldCount() > 0), function Unwrap, file nan_object_wrap.h, line 32.` ([#2025](https://github.com/Automattic/node-canvas/issues/2025))
* `textBaseline` and `textAlign` were not saved/restored by `save()`/`restore()`. ([#1936](https://github.com/Automattic/node-canvas/issues/2029))
* Update nan to v2.17.0 to ensure Node.js v18+ support.
### Changed
* Improve performance and memory usage of `save()`/`restore()`.
* `save()`/`restore()` no longer have a maximum depth (previously 64 states).

2.10.1
==================
### Fixed
* Fix `actualBoundingBoxLeft` and `actualBoundingBoxRight` when `textAlign='center'` or `'right'` ([#1909](https://github.com/Automattic/node-canvas/issues/1909))
* Fix `rgba(r,g,b,0)` with alpha to 0 should parse as transparent, not opaque. ([#2110](https://github.com/Automattic/node-canvas/pull/2110))

2.10.0
==================
### Added
* Export `pangoVersion`
* [`ctx.roundRect()`](https://developer.chrome.com/blog/canvas2d/#round-rect)
### Fixed
* `rgba(r,g,b)` with no alpha should parse as opaque, not transparent. ([#2029](https://github.com/Automattic/node-canvas/issues/2029))
* Typo in `PngConfig.filters` types. ([#2072](https://github.com/Automattic/node-canvas/issues/2072))
* `createPattern()` always used "repeat" mode; now supports "repeat-x" and "repeat-y". ([#2066](https://github.com/Automattic/node-canvas/issues/2066))
* Crashes and hangs when using non-finite values in `context.arc()`. ([#2055](https://github.com/Automattic/node-canvas/issues/2055))
* Incorrect `context.arc()` geometry logic for full ellipses. ([#1808](https://github.com/Automattic/node-canvas/issues/1808), ([#1736](https://github.com/Automattic/node-canvas/issues/1736)))
* Added missing `deregisterAllFonts` to the Typescript declaration file ([#2096](https://github.com/Automattic/node-canvas/pull/2096))
* Add `User-Agent` header when requesting remote images ([#2099](https://github.com/Automattic/node-canvas/issues/2099))

2.9.3
==================
### Fixed
* Wrong fonts used when calling `registerFont` multiple times with the same family name ([#2041](https://github.com/Automattic/node-canvas/issues/2041))

2.9.2
==================
### Fixed
* All exports now work when Canvas is used in ES Modules (ESM). ([#2047](https://github.com/Automattic/node-canvas/pull/2047))
* `npm rebuild` will now re-fetch prebuilt binaries to avoid `NODE_MODULE_VERSION` mismatch errors. ([#1982](https://github.com/Automattic/node-canvas/pull/1982))

2.9.1
==================
### Fixed
* Stringify CanvasGradient, CanvasPattern and ImageData like browsers do. (#1639, #1646)
* Add missing include for `toupper`.
* Throw an error instead of crashing the process if `getImageData` or `putImageData` is called on a PDF or SVG canvas (#1853)
* Compatibility with Typescript 4.6
* Near-perfect font matching on Linux (#1572)
* Fix multi-byte font path support on Windows.
* Allow rebuild of this library

2.9.0
==================
### Changed
* Refactor functions to classes.
* Changed `DOMPoint()` constructor to check for parameter nullability.
* Changed `DOMMatrix.js` to use string literals for non-special cases.
* Remove semicolons from Dommatrix.js.
* Update nan to v2.15.0 to ensure Node.js v14+ support.
* Clean up inf/nan macros and slightly speed up argument checking.
### Added
* Added `deregisterAllFonts` method to free up memory and reduce font conflicts.
### Fixed
* Support Apple M1 Homebrew install that puts canvas install library files in `/opt/homebrew/lib`

2.8.0
==================
### Changed
* Upgrade dtslint
* Upgrade node-pre-gyp to 1.0.0. Note that if you are using special node-pre-gyp
  features like `node_pre_gyp_accessKeyId`, you may need to make changes to your
  installation procedure. See https://github.com/mapbox/node-pre-gyp/blob/master/CHANGELOG.md#100.
* Add Node.js v16 to CI.
* The C++ class method `nBytes()` now returns a size_t. (Because this is a C++
  method only, this is not considered a breaking change.)
### Added
* Add support for  `inverse()` and `invertSelf()` to `DOMMatrix` (#1648)
* Add support for `context.getTransform()` ([#1769](https://github.com/Automattic/node-canvas/pull/1769))
* Add support for `context.setTransform(dommatrix)` ([#1769](https://github.com/Automattic/node-canvas/pull/1769))
### Fixed
* Fix `actualBoundingBoxLeft` and `actualBoundingBoxRight` returned by `measureText` to be the ink rect ([#1776](https://github.com/Automattic/node-canvas/pull/1776), fixes [#1703](https://github.com/Automattic/node-canvas/issues/1703)).
* Fix Pango logging "expect ugly output" on Windows (#1643)
* Fix benchmark for createPNGStream (#1672)
* Fix dangling reference in BackendOperationNotAvailable exception (#1740)
* Fix always-false comparison warning in Canvas.cc.
* Fix Node.js crash when throwing from an onload or onerror handler.

2.7.0
==================
### Changed
* Switch CI to Github Actions. (Adds Windows and macOS builds.)
* Switch prebuilds to GitHub actions in the Automattic/node-canvas repository.
  Previously these were in the [node-gfx/node-canvas-prebuilt](https://github.com/node-gfx/node-canvas-prebuilt)
  and triggered manually.
* Speed up `fillStyle=` and `strokeStyle=`
### Added
* Export `rsvgVersion`.
* CanvasPattern’s `setTransform` method is no longer missing
### Fixed
* Fix BMP issues. (#1497)
* Update typings to support jpg and addPage on NodeCanvasRenderingContext2D (#1509)
* Fix assertion failure when using Visual Studio Code debugger to inspect Image prototype (#1534)
* Fix signed/unsigned comparison warning introduced in 2.6.0, and function cast warnings with GCC8+
* Fix to compile without JPEG support (#1593).
* Fix compile errors with cairo
* Fix Image#complete if the image failed to load.
* Upgrade node-pre-gyp to v0.15.0 to use latest version of needle to fix error when downloading prebuilds.
* Don't throw if `fillStyle` or `strokeStyle` is set to an object, but that object is not a Gradient or Pattern. (This behavior was non-standard: invalid inputs are supposed to be ignored.)

2.6.1
==================
### Fixed
* Ignore `maxWidth` in `fillText` and `strokeText` if it is undefined
* Fix crash (assertion failure) in Node.js 12.x when patterns or gradients are used
* Fix crash (check failure) in Node.js 12.x when using RGB16_565 format. (The
  underlying arraybuffer was incorrectly sized.)
* Fix rendering error when applying shadow width line style (lineCap lineJoin lineDash)

2.6.0
==================
### Changed
* Allow larger buffers to be returned from `toBuffer('raw')`.
### Added
* Support for various BMP headers and color depths (#1435)
### Fixed
* Fix crash when changing canvas width/height while `fillStyle` or `strokeStyle`
  was set to a `CanvasPattern` or `CanvasGradient` (#1357).
* Fix crash when changing width/height of SVG canvases (#1380).
* Fix crash when using `toBuffer('raw')` with large canvases (#1158).
* Clarified meaning of byte ordering for `toBuffer('raw')` in readme. (#1416)
* Fix package.json Typings field to point to Declaration file (#1432)
* Properly check return value from `Set` and `Call`. (#1415)
* Use `Get` version from `Nan` instead of `v8`. (#1415)

2.5.0
==================
### Added
* Support redirects when fetching images (using [simple-get](https://github.com/feross/simple-get)) (#1398)
* Support Node.js v12
### Fixed
* Fix object literal & arrow function syntax usage for IE.

2.4.1
==================
### Fixed
* Guard JPEG width/height against maximum supported (#1385)
* Fix electron 5 and node 12 compatibility
* Fix encoding options (quality) parameter in `canvas.toDataURL()`

2.4.0
==================
### Added
* (Actually) added `resolution` option for `canvas.toBuffer("image/png")` and
  `canvas.createPNGStream()`. This was documented since 2.0.0 but not working.
* Add typescript definitions.
### Fixed
* PDF metadata (added in 2.3.0) wasn't being set with `canvas.createPDFStream()`
* Fix custom "inspect" function deprecation warnings (#1326)

2.3.1
==================
### Fixed
* Fix `canvas.toBuffer()` for JPEGs (#1350)

2.3.0
==================
### Added
* Add support for multiple PDF page sizes
* Add support for embedding document metadata in PDFs

### Fixed
* Don't crash when font string is invalid (bug since 2.2.0) (#1328)
* Fix memory leak in `canvas.toBuffer()` (#1202, #1296)
* Fix memory leak in `ctx.font=` (#1202)

2.2.0
==================
### Added
* BMP support

### Fixed
* Reset context on resurface (#1292)
* Support Jest test framework (#1311)

2.1.0
==================
### Added
* Warn when building with old, unsupported versions of cairo or libjpeg.

2.0.0
==================

**Upgrading from 1.x**
```js
// (1) The Canvas constructor is no longer the default export from the module.
/* old: */
const Canvas = require('canvas')
const mycanvas = new Canvas(width, height)
/* new: */
const { createCanvas, Canvas } = require('canvas')
const mycanvas = createCanvas(width, height)
mycanvas instanceof Canvas // true

/* old: */
const Canvas = require('canvas')
const myimg = new Canvas.Image()
/* new: */
const { Image } = require('canvas')
const myimg = new Image()

// (2) The quality argument for canvas.createJPEGStream/canvas.jpegStream now
//     goes from 0 to 1 instead of from 0 to 100:
canvas.createJPEGStream({ quality: 50 }) // old
canvas.createJPEGStream({ quality: 0.5 }) // new

// (3) The ZLIB compression level and PNG filter options for canvas.toBuffer are
//     now named instead of positional arguments:
canvas.toBuffer(undefined, 3, canvas.PNG_FILTER_NONE) // old
canvas.toBuffer(undefined, { compressionLevel: 3, filters: canvas.PNG_FILTER_NONE }) // new
// or specify the mime type explicitly:
canvas.toBuffer('image/png', { compressionLevel: 3, filters: canvas.PNG_FILTER_NONE }) // new

// (4) #2 also applies for canvas.pngStream, although these arguments were not
//     documented:
canvas.pngStream(3, canvas.PNG_FILTER_NONE) // old
canvas.pngStream({ compressionLevel: 3, filters: canvas.PNG_FILTER_NONE }) // new

// (5) canvas.syncPNGStream() and canvas.syncJPEGStream() have been removed:
canvas.syncPNGStream() // old
canvas.createSyncPNGStream() // old
canvas.createPNGStream() // new

canvas.syncJPEGStream() // old
canvas.createSyncJPEGStream() // old
canvas.createJPEGStream() // new

// (6) Context2d.filter has been renamed to context2d.quality to avoid a
//     conflict with the new standard 'filter' property.
context.filter = 'best' // old
context.quality = 'best' // new
```

### Breaking
 * Drop support for Node.js <6.x
 * Remove sync stream functions (bc53059). Note that most streams are still
   synchronous (run in the main thread); this change just removed `syncPNGStream`
   and `syncJPEGStream`.
 * Pango is now *required* on all platforms (7716ae4).
 * Make the `quality` argument for JPEG output go from 0 to 1 to match HTML spec.
 * Make the `compressionLevel` and `filters` arguments for `canvas.toBuffer()`
   named instead of positional. Same for `canvas.pngStream()`, although these
   arguments were not documented.
 * See also: *Correct some of the `globalCompositeOperator` types* under
   **Fixed**. These changes were bug-fixes, but will break existing code relying
   on the incorrect types.
 * Rename `context2d.filter` to `context2d.quality` to avoid a conflict with the
   new standard 'filter' property. Note that the standard 'filter' property is
   not yet implemented.

### Fixed
 * Fix build with SVG support enabled (#1123)
 * Prevent segfaults caused by loading invalid fonts (#1105)
 * Fix memory leak in font loading
 * Port has_lib.sh to javascript (#872)
 * Correctly sample the edge of images when scaling (#1084)
 * Detect CentOS libjpeg path (b180ea5)
 * Improve measureText accuracy (2bbfec5)
 * Fix memory leak when image callbacks reference the image (1f4b646)
 * Fix putImageData(data, negative, negative) (2102e25)
 * Fix SVG recognition when loading from buffer (77749e6)
 * Re-rasterize SVG when drawing to a context and dimensions changed (79bf232)
 * Prevent JPEG errors from crashing process (#1124)
 * Improve handling of invalid arguments (#1129)
 * Fix repeating patterns when drawing a canvas to itself (#1136)
 * Prevent segfaults caused by creating a too large canvas
 * Fix parse-font regex to allow for whitespaces.
 * Allow assigning non-string values to fillStyle and strokeStyle
 * Fix drawing zero-width and zero-height images.
 * Fix DEP0005 deprecation warning
 * Don't assume `data:` URIs assigned to `img.src` are always base64-encoded
 * Fix formatting of color strings (e.g. `ctx.fillStyle`) on 32-bit platforms
 * Explicitly export symbols for the C++ API
 * Named CSS colors should match case-insensitive
 * Correct some of the `globalCompositeOperator` types to match the spec:
     * "hsl-hue" is now "hue"
     * "hsl-saturation" is now "saturation"
     * "hsl-color" is now "color"
     * "hsl-luminosity" is now "luminosity"
     * "darker" is now "darken"
     * "dest" is now "destination"
     * "add" is removed (but is the same as "lighter")
     * "source" is now "copy"
 * Provide better, Node.js core-style coded errors for failed sys calls. (For
   example, provide an error with code 'ENOENT' if setting `img.src` to a path
   that does not exist.)
 * Support reading CMYK, YCCK JPEGs.
 * Hide `Image.prototype.source`
 * Fix behavior of maxWidth (#1088)
 * Fix behavior of textAlignment with maxWidth (#1253)

### Added
 * Prebuilds (#992) with different libc versions to the prebuilt binary (#1140)
 * Support `canvas.getContext("2d", {alpha: boolean})` and
   `canvas.getContext("2d", {pixelFormat: "..."})`
 * Support indexed PNG encoding.
 * Support `currentTransform` (d6714ee)
 * Export `CanvasGradient` (6a4c0ab)
 * Support #RGBA , #RRGGBBAA hex colors (10a82ec)
 * Support maxWidth arg for fill/strokeText (175b40d)
 * Support image.naturalWidth/Height (a5915f8)
 * Render SVG img elements when librsvg is available (1baf00e)
 * Support ellipse method (4d4a726)
 * Browser-compatible API (6a29a23)
 * Support for jpeg on Windows (42e9a74)
 * Support for backends (1a6dffe)
 * Support for `canvas.toBuffer("image/jpeg")`
 * Unified configuration options for `canvas.toBuffer()`, `canvas.pngStream()`
   and `canvas.jpegStream()`
 * ~~Added `resolution` option for `canvas.toBuffer("image/png")` and
   `canvas.createPNGStream()`~~ this was not working
 * Support for `canvas.toDataURI("image/jpeg")` (sync)
 * Support for `img.src = <url>` to match browsers
 * Support reading data URL on `img.src`
 * Readme: add dependencies command for OpenBSD
 * Throw error if calling jpegStream when canvas was not built with JPEG support
 * Emit error if trying to load GIF, SVG or JPEG image when canvas was not built
   with support for that format

1.6.x (unreleased)
==================
### Fixed
 * Make setLineDash able to handle full zeroed dashes (b8cf1d7)
 * Fix reading fillStyle after setting it from gradient to color (a84b2bc)

### Added
 * Support for pattern repeat and no-repeat (#1066)
 * Support for context globalAlpha for gradients and patterns (#1064)

1.6.9 / 2017-12-20
==================
### Fixed
 * Fix some instances of crashes (7c9ec58, 8b792c3)
 * Fix node 0.x compatibility (dca33f7)

1.6.8 / 2017-12-12
==================
### Fixed
 * Faster, more compliant parseFont (4625efa, 37cd969)

1.6.7 / 2017-09-08
==================
### Fixed
 * Minimal backport of #985 (rotated text baselines) (c19edb8)

1.6.6 / 2017-05-03
==================
### Fixed
 * Use .node extension for requiring native module so webpack works (1b05599)
 * Correct text baseline calculation (#1037)

1.6.5 / 2017-03-18
==================
### Changed
 * Parse font using parse-css-font and units-css (d316416)

1.6.4 / 2017-02-26
==================
### Fixed
 * Make sure Canvas#toDataURL is always async if callback is passed (8586d72)

1.6.3 / 2017-02-14
==================
### Fixed
 * Fix isnan() and isinf() on clang (5941e13)

1.6.2 / 2016-10-30
==================
### Fixed
 * Fix deprecation warnings (c264879)
 * Bump nan (e4aea20)

1.6.1 / 2016-10-23
==================

### Fixed
 * Make has_lib.sh work on BSD OSes (1727d66)

1.6.0 / 2016-10-16
==================

 * Support canvas.getBuffer('raw') (#819)

1.5.0 / 2016-09-11
==================

 * Crude PDF stream implementation (#781)
 * Update CI settings (#797)
 * Reduce some of the install warnings (#794)
 * Fix lineDash browser tests never finishing (#793)
 * Add issue template (#791)

1.4.0 / 2016-06-03
==================

 * Add support for evenodd fill rule (#762)

1.3.17 / 2016-06-03
===================

 * Removing redundant duplicate calls (#769)
 * Cleanup examples (#776)
 * Fix CanvasRenderingContext2D class name (#777)

1.3.16 / 2016-05-29
===================

  * Fix leak of data when streaming JPEG (#774)

1.3.15 / 2016-05-09
===================

  * Fix segfault in putImageData (#750)

1.3.14 / 2016-05-05
===================

  * Clamp JPEG buffer size (#739)

1.3.13 / 2016-05-01
===================

  * Bumb NAN version (#759)

1.3.12 / 2016-03-01
===================

  * Expose freetype version (#718)
  * Require new in constructor (#717)

1.3.11 / 2016-03-01
===================

  * Properly clamp quality in toDataURL (#728)
  * Strict mode (#719)

1.3.10 / 2016-02-07
===================

  * Fix segfault on node 0.10.x (#712)

1.3.9 / 2016-01-27
==================

  * Allow to unbind onload/onerror callback handlers (#706)

1.3.8 / 2016-01-22
==================

  * Cleanup build scripts and fix pangocairo detection (#701)

1.3.7 / 2016-01-13
==================

  * Don't unbind onload/onerror callbacks after invoking them (#615)

1.3.6 / 2016-01-06
==================

  * Allow optional arguments in `toDataURL` to be `undefined` and improve `toDataURL`'s spec compliance (#690)

1.3.5 / 2015-12-07
==================

  * Add image/jpeg support to `toDataUrl` (#685)

1.3.4 / 2015-11-21
==================

  * Upgrade nan to 2.1.0 (#671)

1.3.3 / 2015-11-21
==================

  * Fix compilation on Visual Studio 2015 (#670)

1.3.2 / 2015-11-18
==================

  * Fix incorrect Y offset and scaling for shadows (#669)

1.3.1 / 2015-11-09
==================

  * Wrap std::min calls in paranthesis to prevent macro expansion on windows (#660)

1.3.0 / 2015-10-26
==================

  * Expose ImageData constructor and make it more spec-compliant (#569)

1.2.11 / 2015-10-20
===================

  * Implement blur on images (#648)

1.2.10 / 2015-10-12
===================

  * Fix segfault in Canvas#jpegStream (#629)

1.2.9 / 2015-09-14
==================

  * Upgrade to Nan 2.x with support for iojs 3.x and Node.js 4.x (#622)

1.2.8 / 2015-08-30
==================

  * Clean up the tests (#612)
  * Replace CanvasPixelArray with Uint8ClampedArray to be API-compliant (#604)
  * Specify travis iojs versions (#611)

1.2.7 / 2015-07-29
==================

  * Avoid future reserved keyword (#592)

1.2.6 / 2015-07-29
==================

  * Fix the build on windows (#589)

1.2.5 / 2015-07-28
==================

  * Another npm release, since 1.2.4 was botched (see #596)

1.2.4 / 2015-07-23
==================

  * Point `homepage` and `repository` links to [`github.com/Automattic/node-canvas`][repo]
  * Fix Travis builds and Cairo include paths (thanks, Linus Unnebäck!)

1.2.3 / 2015-05-21
==================

  * Update TJ Holowaychuk's username in the readme
  * Fix segmentation fault in `Image::loadFromBuffer` when buffer is empty
  * Optimize getImageData()
  * package: add "license" attribute
  * package: update "nan" to v1.8.4
  * package: append `.git` to "repository" URL

1.2.2 / 2015-04-18
==================

  * Now works on io.js
  * Fix 'drawImage' scaling (the dimensions of the region that gets clipped also needs to be scaled).
  * Fix bug in StreamPNGSync

1.2.1 / 2015-02-10
==================

  * Use non-cairo 1.12 API for shadow blur

1.2.0 / 2015-01-31
==================

  * travis: drop support for node v0.6
  * Merge pull request #507 from salzhrani/iojs
  * io.js compatibility
  * Merge pull request #505 from woodcoder/shadow-blur
  * Fix issue with line width not being correct in stroked shadows.
  * Add another shadow/transform test.
  * Refactor setSourceRGBA to allow the context to be supplied.
  * Simple image shadow (no blurring or handling current transforms) based on image's alpha channel.
  * Test showing issue #133, that images don't have shadows.
  * The +1 on the offset seems to match the browser's output better, but I can't work out why it would be needed (unless it's pixel alignment related).
  * Make the shadow radius more accurately match the browser's, making use of sigma scale as used in SKIA: https://github.com/google/skia/blob/master/src/effects/SkBlurMask.cpp#L26.
  * Create a new image surface to render blurred shadows to, this means that vector formats like PDF will now render blurs.
  * Add recommended calls to flush and dirty buffer, as per http://www.cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-get-data.
  * Add PDF button to test page to easily generate PDF version of the test image.
  * Fix to ensure shadowOffset is unaffected by the current transform.
  * New test illustrating that canvas implementation doesn't translate the shadowOffset.
  * Merge pull request #490 from AllYearbooks/master
  * Merge pull request #501 from motiz88/hsl-color
  * Code style + attribution. Also removed parseClipped() and commented out wrapInt (now wrap_int).
  * Added visual tests for hsl() and hsla() color parsing.
  * Fixed <number> handling in hsl/hsla color parser. parseNumber() was erroring out on numbers with long fractional parts.
  * hsl/hsla color parsing + rebeccapurple hsl() and hsla() color values are now supported, with corresponding unit tests. Also added rebeccapurple (from CSS Color Level 4) to the named color list.
  * float rather than int for drawImage arguments
  * with_pango to true and use fontconfig to load fonts
  * Merge pull request #399 from nulltask/fix/lighten
  * Merge pull request #465 from espadrine/master
  * Merge pull request #470 from tonylukasavage/patch-1
  * Add one-liner MacPorts install to docs
  * Offer SVG output.
  * Readme update: node-gyp.
  * Readme: fix subheading size
  * Readme: remove Gemnasium badge, use SVG for npm badge
  * Readme: add Travis-CI badge
  * change operator lighter to lighten

1.1.6 / 2014-08-01
==================

  * export canvas.CanvasPixelArray instead of canvas.PixelArray which is undefined
  * Glib version test into giflib exists test
  * Giflib 5.1
  * install: use an even older version of giflib (v4.1.6)
  * install: use an older version of giflib (v4.2.3)
  * install: install `giflib`
  * install: use more compatible sh syntax
  * travis: attempt to run the ./install script before testintg
  * travis: test node v0.6, v0.8, v0.10, and v0.11
  * Distinguish between 'add' and 'lighter'

1.1.5 / 2014-06-26
==================

  * Readme: remove Contributors section
  * Readme: update copyright
  * On Windows, copy required DLLs next to ".node" file (#442 @pandell)
  * Duplicate "msvc_settings" for "Debug" configuration
  * Remove unneeded #include <nan.h>
  * Use float constants to prevent double->float conversion warning
  * Ignore Visual C++ 2013 warnings (#441 @pandell)
  * Add algorithm include to CanvasRenderingContext2d.cc for std::min (#435 @kkoopa)
  * Updated NAN to 1.2.0 (#434 @kkoopa)

1.1.4 / 2014-06-08
==================

  * Fix compile error with Visual C++
  * Add support for the lineDash API
  * Update NAN
  * New V8 compatibility
  * Correctly limit bounds in PutImageData to prevent segment fault
  * Fix segfault when onload and onerror are not function
  * Add support for Node 0.11.9

1.1.3 / 2014-01-08
==================

  * Add CAIRO_FORMAT_INVALID
  * Readjust the amount of allocated memory
  * Fix argument index for filter parameter
  * Make has_lib.sh work properly on Debian 64bit

1.1.2 / 2013-10-31
==================

  * NAN dep upgrade, full node@<=0.11.8 compatibility
  * Use node::MakeCallback() instead of v8::Function::Call()
  * Improve nan location discovery
  * Fix enabling gif/jpeg options on Ubuntu 13.04

1.1.1 / 2013-10-09
==================

  * add better support for outdated versions of Cairo

1.1.0 / 2013-08-01
==================

  * add png compression options
  * add jpeg stream progressive mode option
  * fix resource leaks on read errors

1.0.4 / 2013-07-23
==================

  * 0.11.4+ compatibility using NAN
  * fix typo in context2d for imageSmoothingEnabled

1.0.3 / 2013-06-04
==================

  * add "nearest" and "bilinear" to patternQuality
  * fix fread() retval check (items not bytes)
  * removed unneeded private fields

1.0.2 / 2013-03-22
==================

  * add Context2d#imageSmoothingEnabled=

1.0.1 / 2013-02-25
==================

  * travis: test modern node versions
  * change the node-gyp build to use pkg-config

1.0.0 / 2013-01-16
==================

  * add conditional pango font support [Julian Viereck]
  * add `Canvas#{png,jpeg}Stream()` alias of create* legacy methods
  * add support for grayscale JPEGs
  * fix: explicitly cast the after work callback function to "uv_after_work_cb"
  * fix test server for express 3.x
  * fix: call cairo_surface_finish in ~Canvas when pdf
  * remove old 0.4.x binding support. Closes #197

0.13.1 / 2012-08-20
==================

  * fix cases where GIF_LIB_VERSION is not defined
  * fix auto-detection of optional libraries for OS X
  * fix Context2d::SetFont for pango when setting normal weight/style

0.13.0 / 2012-08-12
==================

  * add pango support [c-spencer]
  * add pango / png / jpeg gyp auto-detection [c-spencer]
  * add `.gifVersion` [tootallnate]
  * add `.jpegVersion` [tootallnate]
  * add moar gyp stuff [tootallnate]
  * remove wscript
  * fix `closure_destroy()` with cast for `AdjustAmountOfExternalAllocatedMemory()`

0.12.1 / 2012-06-29
==================

  * fix jpeg malloc Image issue. Closes #160 [c-spencer]
  * Improve Image mode API
  * Add clearData method to handle reassignment of src, and clean up mime data memory handling.
  * Improve how _data_len is managed and use to adjust memory, hide more of mime API behind cairo version conditional.
  * Add optional mime-data tracking to Image.
  * Refactor JPEG decoding into decodeJPEGIntoSurface

0.12.0 / 2012-05-02
==================

  * Added `textDrawingMode` context property [c-spencer]
  * Added additional TextMetrics properties [c-spencer]

0.11.3 / 2012-04-25
==================

  * Fixed `Image` memory leak. Closes #150
  * Fixed Context2d::hasShadow()

0.11.2 / 2012-04-12
==================

  * Fixed: pdf memory leak, free closure and surface in ~Canvas

0.11.1 / 2012-04-10
==================

  * Changed: renamed .nextPage() to .addPage()

0.11.0 / 2012-04-10
==================

  * Added quick PDF support
  * Added `Canvas#type` getter
  * Added ./examples/pdf-images.js
  * Added ./examples/multiple-page-pdf.js
  * Added ./examples/small-pdf.js

0.10.3 / 2012-02-27
==================

  * Fixed quadratic curve starting point for undefined path. Closes #155

0.10.2 / 2012-02-06
==================

  * Fixed: Context2d setters with invalid values ignored
  * Changed: replaced seek with `fstat()`

0.10.1 / 2012-01-31
==================

  * Added _/opt/local/lib_ to wscript [obarthel]
  * Added bounds checking to `rgba_to_string()` [obarthel]
  * Fixed cleanup in JPEG Image loading [obarthel]
  * Fixed missing CSS color table values [obarthel]

0.10.0 / 2012-01-18
==================

  * Added `ctx.createPattern()` [slaskis]

0.9.0 / 2012-01-13
==================

  * Added `createJPEGStream()` [Elijah Hamovitz]

0.8.3 / 2012-01-04
==================

  * Added support for libjpeg62-dev or libjpeg8-dev [wwlinx]

0.8.2 / 2011-12-14
==================

  * Fixed two memory leaks in context2d [Tharit]
  * Fixed `make test-server`

0.8.1 / 2011-10-31
==================

  * Added 0.5.x support [TooTallNate]
  * Fixed `measureText().width`. Closes #126

0.8.0 / 2011-10-28
==================

  * Added data uri support. Closes #49

0.7.3 / 2011-09-14
==================

  * Added better lineTo() / moveTo() exception messages

0.7.2 / 2011-08-30
==================

  * Changed: prefix some private methods with _

0.7.1 / 2011-08-25
==================

  * Added better image format detection
  * Added libpath options to waf configuration; this was necessary to correctly detect gif and jpeg support on FreeBSD

0.7.0 / 2011-07-12
==================

  * Added GIF support [Brian McKinney]

0.6.0 / 2011-06-04
==================

  * Added `Image#src=Buffer` support. Closes #91
  * Added `devDependencies`
  * Added `source-atop` test
  * Added _image-src.js_ example
  * Removed `V8::AdjustAmountOfExternalAllocatedMemory()` call from `toBuffer()`
  * Fixed v8 memory hint when resizing canvas [atomizer]

0.5.4 / 2011-04-20
==================

  * Added; special case of zero-width rectangle [atomizer]
  * Fixed; do not clamp arguments to integer values [atomizer]
  * Fixed; preserve current path during `fillRect()` and `strokeRect()` [atomizer]
  * Fixed; `restorePath()`: clear current path before appending [atomizer]

0.5.3 / 2011-04-11
==================

  * Clamp image bounds in `PixelArray::PixelArray()` [Marcello Bastea-Forte]

0.5.2 / 2011-04-09
==================

  * Changed; make `PNGStream` a real `Stream` [Marcello Bastea-Forte]

0.5.1 / 2011-03-16
==================

  * Fixed (kinda) `img.src=` error handling
  * Fixed; move closure.h down for malloc ref. Closes #80

0.5.0 / 2011-03-14
==================

  * Added several more operators (color-dodge, color-burn, difference, etc)
  * Performance; no longer re-allocating `closure->data` for each png write
  * Fixed freeing of `Context2d` states
  * Fixed text alignment / baseline [Olaf]
  * Fixed HandleScopes [Olaf]
  * Fixed small misc memory leaks
  * Fixed `Buffer` usage for node 0.4.x

0.4.3 / 2011-01-11
==================

  * Fixed font family dereferencing. Closes #72
  * Fixed; stripping of quotes from font-family before applying
  * Fixed duplicate textAlign getter
  * Removed sans-serif default of _Arial_

0.4.2 / 2010-12-28
==================

  * Fixed font size growing issue after successive calls. Closes #70

0.4.1 / 2010-12-18
==================

  * Fixed; toString() first argument of `{fill,stroke}Text()`. Closes #68

0.4.0 / 2010-12-12
==================

  * Added `drawImage()` with `Canvas` instance support. Closes #67

0.3.3 / 2010-11-30
==================

  * Added `CanvasRenderingContext2d#patternQuality` accessor, accepting _fast_, _good_, and _best_
  * Fixed; pre-multiply `putImageData()` components
  * Fixed; `PixelArray` data is not premultiplied

0.3.2 / 2010-11-26
==================

  * Added --profile option to config
  * Fixed `eio_custom` segfault(s). Closes #46
  * Fixed two named colors. Closes #62 [thanks noonat]
  * Fixed a few warnings
  * Fixed; freeing data in `Image::loadJPEG()` on failure
  * Fixed; include _jpeglib_ only when __HAVE_JPEG__
  * Fixed; using `strstr()` instead of `strnstr()`

0.3.1 / 2010-11-24
==================

  * Fixed; `Image` loading is sync until race-condition is resolved
  * Fixed; `Image::loadJPEG()` return status based on errno

0.3.0 / 2010-11-24
==================

  * Added arcTo(). Closes #11
  * Added c color parser, _./examples/ray.js_ is now twice as fast
  * Fixed `putImageData()` bug messing up rgba channels

0.2.1 / 2010-11-19
==================

  * Added image _resize_ example
  * Fixed canvas resizing via `{width,height}=`. Closes #57
  * Fixed `Canvas#getContext()`, caching the CanvasRenderingContext
  * Fixed async image loading (test server still messed)

0.2.0 / 2010-11-18
==================

  * Added jpeg `Image` support (when libjpeg is available)
  * Added _hsl_ / _hsla_ color support. [Tom Carden]

0.1.0 / 2010-11-17
==================

  * Added `Image`
  * Added `ImageData`
  * Added `PixelArray`
  * Added `CanvasRenderingContext2d#drawImage()`
  * Added `CanvasRenderingContext2d#getImageData()`
  * Added `CanvasRenderingContext2d#createImageData()`
  * Added kraken blur benchmark example
  * Added several new tests
  * Fixed instanceof checks for many c++ methods
  * Fixed test runner in firefox [Don Park]

0.0.8 / 2010-11-12
==================

  * Added `CanvasRenderingContext2d#drawImage()`
  * Fixed `free()` call missing stdlib
  * Fixed Image#{width,height} initialization to 0
  * Fixed; load image on non-LOADING state

0.0.7 / 2010-11-12
==================

  * Fixed _lighter_ for older versions of cairo

0.0.6 / 2010-11-12
==================

  * Added `Image`
  * Added conditional support for cairo 1.10.0 operators

0.0.5 / 2010-11-10
==================

  * Added custom port support to _test/server.js_
  * Added more global composite operator support
  * Added `Context2d#antialias=`
  * Added _voronoi_ example
  * Added -D__NDEBUG__ to default build
  * Added __BUFFER_DATA__ macro for backwards compat buffer data access [Don Park]
  * Fixed getter bug preventing patterns from being returned via `fillStyle` etc

  * Fixed; __CAIRO_STATUS_NO_MEMORY___ on failed {re,m}alloc()
  * Fixed; free `Canvas::ToBuffer()` closure data

0.0.4 / 2010-11-09
==================

  * Bump to fix npm engine cache bug...

0.0.3 / 2010-11-09
==================

  * Added async `toDataURL()` support
  * Added async `toBuffer()` support
  * Removed buffer utils

0.0.2 / 2010-11-08
==================

  * Added shadow support (faster/better gaussian blur to come)
  * Added node v0.3 support [Don Park]
  * Added -O3 to build
  * Removed `Canvas#savePNG()` use `Canvas#createPNGStream()`

0.0.1 / 2010-11-04
==================

  * Initial release

[repo]: https://github.com/Automattic/node-canvas


================================================
FILE: Readme.md
================================================
# node-canvas

![Test](https://github.com/Automattic/node-canvas/workflows/Test/badge.svg)
[![NPM version](https://badge.fury.io/js/canvas.svg)](http://badge.fury.io/js/canvas)

node-canvas is a [Cairo](http://cairographics.org/)-backed Canvas implementation for [Node.js](http://nodejs.org).

## Installation

```bash
$ npm install canvas
```

By default, pre-built binaries will be downloaded if you're on one of the following platforms:
- macOS x86/64
- macOS aarch64 (aka Apple silicon)
- Linux x86/64 (glibc only)
- Windows x86/64

If you want to build from source, use `npm install --build-from-source` and see the **Compiling** section below.

The minimum version of Node.js required is **18.12.0**.

### Compiling

If you don't have a supported OS or processor architecture, or you use `--build-from-source`, the module will be compiled on your system. This requires several dependencies, including Cairo and Pango.

For detailed installation information, see the [wiki](https://github.com/Automattic/node-canvas/wiki/_pages). One-line installation instructions for common OSes are below. Note that libgif/giflib, librsvg and libjpeg are optional and only required if you need GIF, SVG and JPEG support, respectively. Cairo v1.10.0 or later is required.

OS | Command
----- | -----
macOS | Using [Homebrew](https://brew.sh/):<br/>`brew install pkg-config cairo pango libpng jpeg giflib librsvg pixman python-setuptools`
Ubuntu | `sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev`
Fedora | `sudo yum install gcc-c++ cairo-devel pango-devel libjpeg-turbo-devel giflib-devel`
Solaris | `pkgin install cairo pango pkg-config xproto renderproto kbproto xextproto`
OpenBSD | `doas pkg_add cairo pango png jpeg giflib`
Windows | See the [wiki](https://github.com/Automattic/node-canvas/wiki/Installation:-Windows)
Others | See the [wiki](https://github.com/Automattic/node-canvas/wiki)

**Mac OS X v10.11+:** If you have recently updated to Mac OS X v10.11+ and are experiencing trouble when compiling, run the following command: `xcode-select --install`. Read more about the problem [on Stack Overflow](http://stackoverflow.com/a/32929012/148072).
If you have xcode 10.0 or higher installed, in order to build from source you need NPM 6.4.1 or higher.

## Quick Example

```javascript
const { createCanvas, loadImage } = require('canvas')
const canvas = createCanvas(200, 200)
const ctx = canvas.getContext('2d')

// Write "Awesome!"
ctx.font = '30px Impact'
ctx.rotate(0.1)
ctx.fillText('Awesome!', 50, 100)

// Draw line under text
var text = ctx.measureText('Awesome!')
ctx.strokeStyle = 'rgba(0,0,0,0.5)'
ctx.beginPath()
ctx.lineTo(50, 102)
ctx.lineTo(50 + text.width, 102)
ctx.stroke()

// Draw cat with lime helmet
loadImage('examples/images/lime-cat.jpg').then((image) => {
  ctx.drawImage(image, 50, 0, 70, 70)

  console.log('<img src="' + canvas.toDataURL() + '" />')
})
```

## Upgrading from 1.x to 2.x

See the [changelog](https://github.com/Automattic/node-canvas/blob/master/CHANGELOG.md) for a guide to upgrading from 1.x to 2.x.

For version 1.x documentation, see [the v1.x branch](https://github.com/Automattic/node-canvas/tree/v1.x).

## Documentation

This project is an implementation of the Web Canvas API and implements that API as closely as possible. For API documentation, please visit [Mozilla Web Canvas API](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API). (See [Compatibility Status](https://github.com/Automattic/node-canvas/wiki/Compatibility-Status) for the current API compliance.) All utility methods and non-standard APIs are documented below.

### Utility methods

* [createCanvas()](#createcanvas)
* [createImageData()](#createimagedata)
* [loadImage()](#loadimage)
* [registerFont()](#registerfont)
* [deregisterAllFonts()](#deregisterAllFonts)


### Non-standard APIs

* [Image#src](#imagesrc)
* [Image#dataMode](#imagedatamode)
* [Canvas#toBuffer()](#canvastobuffer)
* [Canvas#createPNGStream()](#canvascreatepngstream)
* [Canvas#createJPEGStream()](#canvascreatejpegstream)
* [Canvas#createPDFStream()](#canvascreatepdfstream)
* [Canvas#toDataURL()](#canvastodataurl)
* [CanvasRenderingContext2D#patternQuality](#canvasrenderingcontext2dpatternquality)
* [CanvasRenderingContext2D#quality](#canvasrenderingcontext2dquality)
* [CanvasRenderingContext2D#textDrawingMode](#canvasrenderingcontext2dtextdrawingmode)
* [CanvasRenderingContext2D#globalCompositeOperation = 'saturate'](#canvasrenderingcontext2dglobalcompositeoperation--saturate)
* [CanvasRenderingContext2D#antialias](#canvasrenderingcontext2dantialias)

### createCanvas()

> ```ts
> createCanvas(width: number, height: number, type?: 'PDF'|'SVG') => Canvas
> ```

Creates a Canvas instance. This method works in both Node.js and Web browsers, where there is no Canvas constructor. (See `browser.js` for the implementation that runs in browsers.)

```js
const { createCanvas } = require('canvas')
const mycanvas = createCanvas(200, 200)
const myPDFcanvas = createCanvas(600, 800, 'pdf') // see "PDF Support" section
```

### createImageData()

> ```ts
> createImageData(width: number, height: number) => ImageData
> createImageData(data: Uint8ClampedArray, width: number, height?: number) => ImageData
> // for alternative pixel formats:
> createImageData(data: Uint16Array, width: number, height?: number) => ImageData
> ```

Creates an ImageData instance. This method works in both Node.js and Web browsers.

```js
const { createImageData } = require('canvas')
const width = 20, height = 20
const arraySize = width * height * 4
const mydata = createImageData(new Uint8ClampedArray(arraySize), width)
```

### loadImage()

> ```ts
> loadImage() => Promise<Image>
> ```

Convenience method for loading images. This method works in both Node.js and Web browsers.

```js
const { loadImage } = require('canvas')
const myimg = loadImage('http://server.com/image.png')

myimg.then(() => {
  // do something with image
}).catch(err => {
  console.log('oh no!', err)
})

// or with async/await:
const myimg = await loadImage('http://server.com/image.png')
// do something with image
```

### registerFont()

> ```ts
> registerFont(path: string, { family: string, weight?: string, style?: string }) => void
> ```

To use a font file that is not installed as a system font, use `registerFont()` to register the font with Canvas.

```js
const { registerFont, createCanvas } = require('canvas')
registerFont('comicsans.ttf', { family: 'Comic Sans' })

const canvas = createCanvas(500, 500)
const ctx = canvas.getContext('2d')

ctx.font = '12px "Comic Sans"'
ctx.fillText('Everyone hates this font :(', 250, 10)
```

The second argument is an object with properties that resemble the CSS properties that are specified in `@font-face` rules. You must specify at least `family`. `weight`, and `style` are optional and default to `'normal'`.

### deregisterAllFonts()

> ```ts
> deregisterAllFonts() => void
> ```

Use `deregisterAllFonts` to unregister all fonts that have been previously registered. This method is useful when you want to remove all registered fonts, such as when using the canvas in tests

```ts
const { registerFont, createCanvas, deregisterAllFonts } = require('canvas')

describe('text rendering', () => {
    afterEach(() => {
        deregisterAllFonts();
    })
    it('should render text with Comic Sans', () => {
        registerFont('comicsans.ttf', { family: 'Comic Sans' })

        const canvas = createCanvas(500, 500)
        const ctx = canvas.getContext('2d')
        
        ctx.font = '12px "Comic Sans"'
        ctx.fillText('Everyone loves this font :)', 250, 10)
        
        // assertScreenshot()
    })
})
```

### Image#src

> ```ts
> img.src: string|Buffer
> ```

As in browsers, `img.src` can be set to a `data:` URI or a remote URL. In addition, node-canvas allows setting `src` to a local file path or `Buffer` instance.

```javascript
const { Image } = require('canvas')

// From a buffer:
fs.readFile('images/squid.png', (err, squid) => {
  if (err) throw err
  const img = new Image()
  img.onload = () => ctx.drawImage(img, 0, 0)
  img.onerror = err => { throw err }
  img.src = squid
})

// From a local file path:
const img = new Image()
img.onload = () => ctx.drawImage(img, 0, 0)
img.onerror = err => { throw err }
img.src = 'images/squid.png'

// From a remote URL:
img.src = 'http://picsum.photos/200/300'
// ... as above

// From a `data:` URI:
img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
// ... as above
```

*Note: In some cases, `img.src=` is currently synchronous. However, you should always use `img.onload` and `img.onerror`, as we intend to make `img.src=` always asynchronous as it is in browsers. See https://github.com/Automattic/node-canvas/issues/1007.*

### Image#dataMode

> ```ts
> img.dataMode: number
> ```

Applies to JPEG images drawn to PDF canvases only.

Setting `img.dataMode = Image.MODE_MIME` or `Image.MODE_MIME|Image.MODE_IMAGE` enables MIME data tracking of images. When MIME data is tracked, PDF canvases can embed JPEGs directly into the output, rather than re-encoding into PNG. This can drastically reduce filesize and speed up rendering.

```javascript
const { Image, createCanvas } = require('canvas')
const canvas = createCanvas(w, h, 'pdf')
const img = new Image()
img.dataMode = Image.MODE_IMAGE // Only image data tracked
img.dataMode = Image.MODE_MIME // Only mime data tracked
img.dataMode = Image.MODE_MIME | Image.MODE_IMAGE // Both are tracked
```

If working with a non-PDF canvas, image data *must* be tracked; otherwise the output will be junk.

Enabling mime data tracking has no benefits (only a slow down) unless you are generating a PDF.

### Canvas#toBuffer()

> ```ts
> canvas.toBuffer((err: Error|null, result: Buffer) => void, mimeType?: string, config?: any) => void
> canvas.toBuffer(mimeType?: string, config?: any) => Buffer
> ```

Creates a [`Buffer`](https://nodejs.org/api/buffer.html) object representing the image contained in the canvas.

* **callback** If provided, the buffer will be provided in the callback instead of being returned by the function. Invoked with an error as the first argument if encoding failed, or the resulting buffer as the second argument if it succeeded. Not supported for mimeType `raw` or for PDF or SVG canvases.
* **mimeType** A string indicating the image format. Valid options are `image/png`, `image/jpeg` (if node-canvas was built with JPEG support), `raw` (unencoded data in BGRA order on little-endian (most) systems, ARGB on big-endian systems; top-to-bottom), `application/pdf` (for PDF canvases) and `image/svg+xml` (for SVG canvases). Defaults to `image/png` for image canvases, or the corresponding type for PDF or SVG canvas.
* **config**
  * For `image/jpeg`, an object specifying the quality (0 to 1), if progressive compression should be used and/or if chroma subsampling should be used: `{quality: 0.75, progressive: false, chromaSubsampling: true}`. All properties are optional.

  * For `image/png`, an object specifying the ZLIB compression level (between 0 and 9), the compression filter(s), the palette (indexed PNGs only), the the background palette index (indexed PNGs only) and/or the resolution (ppi): `{compressionLevel: 6, filters: canvas.PNG_ALL_FILTERS, palette: undefined, backgroundIndex: 0, resolution: undefined}`. All properties are optional.

    Note that the PNG format encodes the resolution in pixels per meter, so if you specify `96`, the file will encode 3780 ppm (~96.01 ppi). The resolution is undefined by default to match common browser behavior.

  * For `application/pdf`, an object specifying optional document metadata: `{title: string, author: string, subject: string, keywords: string, creator: string, creationDate: Date, modDate: Date}`. All properties are optional and default to `undefined`, except for `creationDate`, which defaults to the current date. *Adding metadata requires Cairo 1.16.0 or later.*

    For a description of these properties, see page 550 of [PDF 32000-1:2008](https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf).

    Note that there is no standard separator for `keywords`. A space is recommended because it is in common use by other applications, and Cairo will enclose the list of keywords in quotes if a comma or semicolon is used.

**Return value**

If no callback is provided, a [`Buffer`](https://nodejs.org/api/buffer.html). If a callback is provided, none.

#### Examples

```js
// Default: buf contains a PNG-encoded image
const buf = canvas.toBuffer()

// PNG-encoded, zlib compression level 3 for faster compression but bigger files, no filtering
const buf2 = canvas.toBuffer('image/png', { compressionLevel: 3, filters: canvas.PNG_FILTER_NONE })

// JPEG-encoded, 50% quality
const buf3 = canvas.toBuffer('image/jpeg', { quality: 0.5 })

// Asynchronous PNG
canvas.toBuffer((err, buf) => {
  if (err) throw err // encoding failed
  // buf is PNG-encoded image
})

canvas.toBuffer((err, buf) => {
  if (err) throw err // encoding failed
  // buf is JPEG-encoded image at 95% quality
}, 'image/jpeg', { quality: 0.95 })

// BGRA pixel values, native-endian
const buf4 = canvas.toBuffer('raw')
const { stride, width } = canvas
// In memory, this is `canvas.height * canvas.stride` bytes long.
// The top row of pixels, in BGRA order on little-endian hardware,
// left-to-right, is:
const topPixelsBGRALeftToRight = buf4.slice(0, width * 4)
// And the third row is:
const row3 = buf4.slice(2 * stride, 2 * stride + width * 4)

// SVG and PDF canvases
const myCanvas = createCanvas(w, h, 'pdf')
myCanvas.toBuffer() // returns a buffer containing a PDF-encoded canvas
// With optional metadata:
myCanvas.toBuffer('application/pdf', {
  title: 'my picture',
  keywords: 'node.js demo cairo',
  creationDate: new Date()
})
```

### Canvas#createPNGStream()

> ```ts
> canvas.createPNGStream(config?: any) => ReadableStream
> ```

Creates a [`ReadableStream`](https://nodejs.org/api/stream.html#stream_class_stream_readable) that emits PNG-encoded data.

* `config` An object specifying the ZLIB compression level (between 0 and 9), the compression filter(s), the palette (indexed PNGs only) and/or the background palette index (indexed PNGs only): `{compressionLevel: 6, filters: canvas.PNG_ALL_FILTERS, palette: undefined, backgroundIndex: 0, resolution: undefined}`. All properties are optional.

#### Examples

```javascript
const fs = require('fs')
const out = fs.createWriteStream(__dirname + '/test.png')
const stream = canvas.createPNGStream()
stream.pipe(out)
out.on('finish', () =>  console.log('The PNG file was created.'))
```

To encode indexed PNGs from canvases with `pixelFormat: 'A8'` or `'A1'`, provide an options object:

```js
const palette = new Uint8ClampedArray([
  //r    g    b    a
    0,  50,  50, 255, // index 1
   10,  90,  90, 255, // index 2
  127, 127, 255, 255
  // ...
])
canvas.createPNGStream({
  palette: palette,
  backgroundIndex: 0 // optional, defaults to 0
})
```

### Canvas#createJPEGStream()

> ```ts
> canvas.createJPEGStream(config?: any) => ReadableStream
> ```

Creates a [`ReadableStream`](https://nodejs.org/api/stream.html#stream_class_stream_readable) that emits JPEG-encoded data.

*Note: At the moment, `createJPEGStream()` is synchronous under the hood. That is, it runs in the main thread, not in the libuv threadpool.*

* `config` an object specifying the quality (0 to 1), if progressive compression should be used and/or if chroma subsampling should be used: `{quality: 0.75, progressive: false, chromaSubsampling: true}`. All properties are optional.

#### Examples

```javascript
const fs = require('fs')
const out = fs.createWriteStream(__dirname + '/test.jpeg')
const stream = canvas.createJPEGStream()
stream.pipe(out)
out.on('finish', () =>  console.log('The JPEG file was created.'))

// Disable 2x2 chromaSubsampling for deeper colors and use a higher quality
const stream = canvas.createJPEGStream({
  quality: 0.95,
  chromaSubsampling: false
})
```

### Canvas#createPDFStream()

> ```ts
> canvas.createPDFStream(config?: any) => ReadableStream
> ```

* `config` an object specifying optional document metadata: `{title: string, author: string, subject: string, keywords: string, creator: string, creationDate: Date, modDate: Date}`. See `toBuffer()` for more information. *Adding metadata requires Cairo 1.16.0 or later.*

Applies to PDF canvases only. Creates a [`ReadableStream`](https://nodejs.org/api/stream.html#stream_class_stream_readable) that emits the encoded PDF. `canvas.toBuffer()` also produces an encoded PDF, but `createPDFStream()` can be used to reduce memory usage.

### Canvas#toDataURL()

This is a standard API, but several non-standard calls are supported. The full list of supported calls is:

```js
dataUrl = canvas.toDataURL() // defaults to PNG
dataUrl = canvas.toDataURL('image/png')
dataUrl = canvas.toDataURL('image/jpeg')
dataUrl = canvas.toDataURL('image/jpeg', quality) // quality from 0 to 1
canvas.toDataURL((err, png) => { }) // defaults to PNG
canvas.toDataURL('image/png', (err, png) => { })
canvas.toDataURL('image/jpeg', (err, jpeg) => { }) // sync JPEG is not supported
canvas.toDataURL('image/jpeg', {...opts}, (err, jpeg) => { }) // see Canvas#createJPEGStream for valid options
canvas.toDataURL('image/jpeg', quality, (err, jpeg) => { }) // spec-following; quality from 0 to 1
```

### CanvasRenderingContext2D#patternQuality

> ```ts
> context.patternQuality: 'fast'|'good'|'best'|'nearest'|'bilinear'
> ```

Defaults to `'good'`. Affects pattern (gradient, image, etc.) rendering quality.

### CanvasRenderingContext2D#quality

> ```ts
> context.quality: 'fast'|'good'|'best'|'nearest'|'bilinear'
> ```

Defaults to `'good'`. Like `patternQuality`, but applies to transformations affecting more than just patterns.

### CanvasRenderingContext2D#textDrawingMode

> ```ts
> context.textDrawingMode: 'path'|'glyph'
> ```

Defaults to `'path'`. The effect depends on the canvas type:

* **Standard (image)** `glyph` and `path` both result in rasterized text. Glyph mode is faster than `path`, but may result in lower-quality text, especially when rotated or translated.

* **PDF** `glyph` will embed text instead of paths into the PDF. This is faster to encode, faster to open with PDF viewers, yields a smaller file size and makes the text selectable. The subset of the font needed to render the glyphs will be embedded in the PDF. This is usually the mode you want to use with PDF canvases.

* **SVG** `glyph` does *not* cause `<text>` elements to be produced as one might expect ([cairo bug](https://gitlab.freedesktop.org/cairo/cairo/issues/253)). Rather, `glyph` will create a `<defs>` section with a `<symbol>` for each glyph, then those glyphs be reused via `<use>` elements. `path` mode creates a `<path>` element for each text string. `glyph` mode is faster and yields a smaller file size.

In `glyph` mode, `ctx.strokeText()` and `ctx.fillText()` behave the same (aside from using the stroke and fill style, respectively).

This property is tracked as part of the canvas state in save/restore.

### CanvasRenderingContext2D#globalCompositeOperation = 'saturate'

In addition to all of the standard global composite operations defined by the Canvas specification, the ['saturate'](https://www.cairographics.org/operators/#saturate) operation is also available.

### CanvasRenderingContext2D#antialias

> ```ts
> context.antialias: 'default'|'none'|'gray'|'subpixel'
> ```

Sets the anti-aliasing mode.

## PDF Output Support

node-canvas can create PDF documents instead of images. The canvas type must be set when creating the canvas as follows:

```js
const canvas = createCanvas(200, 500, 'pdf')
```

An additional method `.addPage()` is then available to create multiple page PDFs:

```js
// On first page
ctx.font = '22px Helvetica'
ctx.fillText('Hello World', 50, 80)

ctx.addPage()
// Now on second page
ctx.font = '22px Helvetica'
ctx.fillText('Hello World 2', 50, 80)

canvas.toBuffer() // returns a PDF file
canvas.createPDFStream() // returns a ReadableStream that emits a PDF
// With optional document metadata (requires Cairo 1.16.0):
canvas.toBuffer('application/pdf', {
  title: 'my picture',
  keywords: 'node.js demo cairo',
  creationDate: new Date()
})
```

It is also possible to create pages with different sizes by passing `width` and `height` to the `.addPage()` method:

```js
ctx.font = '22px Helvetica'
ctx.fillText('Hello World', 50, 80)
ctx.addPage(400, 800)

ctx.fillText('Hello World 2', 50, 80)
```

It is possible to add hyperlinks using `.beginTag()` and `.endTag()`:

```js
ctx.beginTag('Link', "uri='https://google.com'")
ctx.font = '22px Helvetica'
ctx.fillText('Hello World', 50, 80)
ctx.endTag('Link')
```

Or with a defined rectangle:

```js
ctx.beginTag('Link', "uri='https://google.com' rect=[50 80 100 20]")
ctx.endTag('Link')
```

Note that the syntax for attributes is unique to Cairo. See [cairo_tag_begin](https://www.cairographics.org/manual/cairo-Tags-and-Links.html#cairo-tag-begin) for the full documentation.

You can create areas on the canvas using the "cairo.dest" tag, and then link to them using the "Link" tag with the `dest=` attribute. You can also define PDF structure for accessibility by using tag names like "P", "H1", and "TABLE". The standard tags are defined in §14.8.4 of the [PDF 1.7](https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/PDF32000_2008.pdf) specification.

See also:

* [Image#dataMode](#imagedatamode) for embedding JPEGs in PDFs
* [Canvas#createPDFStream()](#canvascreatepdfstream) for creating PDF streams
* [CanvasRenderingContext2D#textDrawingMode](#canvasrenderingcontext2dtextdrawingmode)
  for embedding text instead of paths

## SVG Output Support

node-canvas can create SVG documents instead of images. The canvas type must be set when creating the canvas as follows:

```js
const canvas = createCanvas(200, 500, 'svg')
// Use the normal primitives.
fs.writeFileSync('out.svg', canvas.toBuffer())
```

## SVG Image Support

If librsvg is available when node-canvas is installed, node-canvas can render SVG images to your canvas context. This currently works by rasterizing the SVG image (i.e. drawing an SVG image to an SVG canvas will not preserve the SVG data).

```js
const img = new Image()
img.onload = () => ctx.drawImage(img, 0, 0)
img.onerror = err => { throw err }
img.src = './example.svg'
```

## Image pixel formats (experimental)

node-canvas has experimental support for additional pixel formats, roughly following the [Canvas color space proposal](https://github.com/WICG/canvas-color-space/blob/master/CanvasColorSpaceProposal.md).

```js
const canvas = createCanvas(200, 200)
const ctx = canvas.getContext('2d', { pixelFormat: 'A8' })
```

By default, canvases are created in the `RGBA32` format, which corresponds to the native HTML Canvas behavior. Each pixel is 32 bits. The JavaScript APIs that involve pixel data (`getImageData`, `putImageData`) store the colors in the order {red, green, blue, alpha} without alpha pre-multiplication. (The C++ API stores the colors in the order {alpha, red, green, blue} in native-[endian](https://en.wikipedia.org/wiki/Endianness) ordering, with alpha pre-multiplication.)

These additional pixel formats have experimental support:

* `RGB24` Like `RGBA32`, but the 8 alpha bits are always opaque. This format is always used if the `alpha` context attribute is set to false (i.e. `canvas.getContext('2d', {alpha: false})`). This format can be faster than `RGBA32` because transparency does not need to be calculated.
* `A8` Each pixel is 8 bits. This format can either be used for creating grayscale images (treating each byte as an alpha value), or for creating indexed PNGs (treating each byte as a palette index) (see [the example using alpha values with `fillStyle`](examples/indexed-png-alpha.js) and [the example using `imageData`](examples/indexed-png-image-data.js)).
* `RGB16_565` Each pixel is 16 bits, with red in the upper 5 bits, green in the middle 6 bits, and blue in the lower 5 bits, in native platform endianness. Some hardware devices and frame buffers use this format. Note that PNG does not support this format; when creating a PNG, the image will be converted to 24-bit RGB. This format is thus suboptimal for generating PNGs. `ImageData` instances for this mode use a `Uint16Array` instead of a `Uint8ClampedArray`.
* `A1` Each pixel is 1 bit, and pixels are packed together into 32-bit quantities. The ordering of the bits matches the endianness of the
  platform: on a little-endian machine, the first pixel is the least-significant bit. This format can be used for creating single-color images. *Support for this format is incomplete, see note below.*
* `RGB30` Each pixel is 30 bits, with red in the upper 10, green in the middle 10, and blue in the lower 10. (Requires Cairo 1.12 or later.) *Support for this format is incomplete, see note below.*

Notes and caveats:

* Using a non-default format can affect the behavior of APIs that involve pixel data:

  * `context2d.createImageData` The size of the array returned depends on the number of bit per pixel for the underlying image data format, per the above descriptions.
  * `context2d.getImageData` The format of the array returned depends on the underlying image mode, per the above descriptions. Be aware of platform endianness, which can be determined using node.js's [`os.endianness()`](https://nodejs.org/api/os.html#os_os_endianness)
    function.
  * `context2d.putImageData` As above.

* `A1` and `RGB30` do not yet support `getImageData` or `putImageData`. Have a use case and/or opinion on working with these formats? Open an issue and let us know! (See #935.)

* `A1`, `A8`, `RGB30` and `RGB16_565` with shadow blurs may crash or not render properly.

* The `ImageData(width, height)` and `ImageData(Uint8ClampedArray, width)` constructors assume 4 bytes per pixel. To create an `ImageData` instance with a different number of bytes per pixel, use `new ImageData(new Uint8ClampedArray(size), width, height)` or `new ImageData(new Uint16ClampedArray(size), width, height)`.

## Testing

First make sure you've built the latest version. Get all the deps you need (see [compiling](#compiling) above), and run:

```
npm install --build-from-source
```

For visual tests: `npm run test-server` and point your browser to http://localhost:4000.

For unit tests: `npm run test`.

## Benchmarks

Benchmarks live in the `benchmarks` directory.

## Examples

Examples line in the `examples` directory. Most produce a png image of the same name, and others such as *live-clock.js* launch an HTTP server to be viewed in the browser.

## Original Authors

  - TJ Holowaychuk ([tj](http://github.com/tj))
  - Nathan Rajlich ([TooTallNate](http://github.com/TooTallNate))
  - Rod Vagg ([rvagg](http://github.com/rvagg))
  - Juriy Zaytsev ([kangax](http://github.com/kangax))

## License

### node-canvas

(The MIT License)

Copyright (c) 2010 LearnBoost, and contributors &lt;dev@learnboost.com&gt;

Copyright (c) 2014 Automattic, Inc and contributors &lt;dev@automattic.com&gt;

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the 'Software'), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

### BMP parser

See [license](src/bmp/LICENSE.md)


================================================
FILE: benchmarks/run.js
================================================
/**
 * Adaptive benchmarking. Starts with `initialTimes` iterations, increasing by
 * a power of two each time until the benchmark takes at least `minDurationMs`
 * milliseconds to complete.
 */

const { createCanvas } = require('../')
const canvas = createCanvas(200, 200)
const largeCanvas = createCanvas(1000, 1000)
const ctx = canvas.getContext('2d')

const initialTimes = 10
const minDurationMs = 2000

const queue = []
let running = false

function bm (label, fn) {
  queue.push({ label: label, fn: fn })
  next()
}

function next () {
  if (queue.length && !running) {
    run(queue.pop(), initialTimes, Date.now())
  }
}

function run (benchmark, n, start) {
  running = true
  const originalN = n
  const fn = benchmark.fn

  if (fn.length) { // async
    let pending = n

    while (n--) {
      fn(function () {
        --pending || done(benchmark, originalN, start, true)
      })
    }
  } else {
    while (n--) fn()
    done(benchmark, originalN, start)
  }
}

function done (benchmark, times, start, isAsync) {
  const duration = Date.now() - start

  if (duration < minDurationMs) {
    run(benchmark, times * 2, Date.now())
  } else {
    const opsSec = times / duration * 1000
    if (isAsync) {
      console.log('  - \x1b[33m%s\x1b[0m %s ops/sec (%s times, async)', benchmark.label, opsSec.toLocaleString(), times)
    } else {
      console.log('  - \x1b[33m%s\x1b[0m %s ops/sec (%s times)', benchmark.label, opsSec.toLocaleString(), times)
    }
    running = false
    next()
  }
}

// node-canvas

function fontName () {
  return String.fromCharCode(0x61 + Math.floor(Math.random() * 26)) +
    String.fromCharCode(0x61 + Math.floor(Math.random() * 26)) +
    String.fromCharCode(0x61 + Math.floor(Math.random() * 26)) +
    String.fromCharCode(0x61 + Math.floor(Math.random() * 26))
}

bm('font setter', function () {
  ctx.font = `12px ${fontName()}`
  ctx.font = `400 6px ${fontName()}`
  ctx.font = `1px ${fontName()}`
  ctx.font = `normal normal bold 12cm ${fontName()}`
  ctx.font = `italic 9mm ${fontName}, "Times New Roman", "Apple Color Emoji", "Comic Sans"`
  ctx.font = `small-caps oblique 44px/44px ${fontName()}, "The Quick Brown", "Fox Jumped", "Over", "The", "Lazy Dog"`
})

bm('save/restore', function () {
  for (let i = 0; i < 1000; i++) {
    const max = i & 15
    for (let j = 0; j < max; ++j) {
      ctx.save()
    }
    for (let j = 0; j < max; ++j) {
      ctx.restore()
    }
  }
})

bm('fillStyle= name', function () {
  for (let i = 0; i < 10000; i++) {
    ctx.fillStyle = '#fefefe'
  }
})

bm('lineTo()', function () {
  ctx.lineTo(0, 50)
})

bm('arc()', function () {
  ctx.arc(75, 75, 50, 0, Math.PI * 2, true)
})

bm('fillStyle= hex', function () {
  ctx.fillStyle = '#FFCCAA'
})

bm('fillStyle= rgba()', function () {
  ctx.fillStyle = 'rgba(0,255,80,1)'
})

// Apparently there's a bug in cairo by which the fillRect and strokeRect are
// slow only after a ton of arcs have been drawn.
bm('fillRect()', function () {
  ctx.fillRect(50, 50, 100, 100)
})

bm('strokeRect()', function () {
  ctx.strokeRect(50, 50, 100, 100)
})

bm('linear gradients', function () {
  const lingrad = ctx.createLinearGradient(0, 50, 0, 95)
  lingrad.addColorStop(0.5, '#000')
  lingrad.addColorStop(1, 'rgba(0,0,0,0)')
  ctx.fillStyle = lingrad
  ctx.fillRect(10, 10, 130, 130)
})

bm('toBuffer() 200x200', function () {
  canvas.toBuffer()
})

bm('toBuffer() 1000x1000', function () {
  largeCanvas.toBuffer()
})

bm('toBuffer() async 200x200', function (done) {
  canvas.toBuffer(function (err, buf) {
    if (err) throw err

    done()
  })
})

bm('toBuffer() async 1000x1000', function (done) {
  largeCanvas.toBuffer(function (err, buf) {
    if (err) throw err

    done()
  })
})

bm('toBuffer().toString("base64") 200x200', function () {
  canvas.toBuffer().toString('base64')
})

bm('toDataURL() 200x200', function () {
  canvas.toDataURL()
})

bm('moveTo() / arc() / stroke()', function () {
  ctx.beginPath()
  ctx.arc(75, 75, 50, 0, Math.PI * 2, true) // Outer circle
  ctx.moveTo(110, 75)
  ctx.arc(75, 75, 35, 0, Math.PI, false) // Mouth
  ctx.moveTo(65, 65)
  ctx.arc(60, 65, 5, 0, Math.PI * 2, true) // Left eye
  ctx.moveTo(95, 65)
  ctx.arc(90, 65, 5, 0, Math.PI * 2, true) // Right eye
  ctx.stroke()
})

bm('createImageData(300,300)', function () {
  ctx.createImageData(300, 300)
})

bm('getImageData(0,0,100,100)', function () {
  ctx.getImageData(0, 0, 100, 100)
})

bm('PNGStream 200x200', function (done) {
  const stream = canvas.createPNGStream()
  stream.on('data', function (chunk) {
    // whatever
  })
  stream.on('end', function () {
    done()
  })
})


================================================
FILE: binding.gyp
================================================
{
  'conditions': [
    ['OS=="win"', {
      'variables': {
        'GTK_Root%': 'C:/GTK',  # Set the location of GTK all-in-one bundle
        'with_jpeg%': 'false',
        'with_gif%': 'false',
        'with_rsvg%': 'false',
        'variables': { # Nest jpeg_root to evaluate it before with_jpeg
          'jpeg_root%': '<!(node ./util/win_jpeg_lookup)'
        },
        'jpeg_root%': '<(jpeg_root)', # Take value of nested variable
        'conditions': [
          ['jpeg_root==""', {
            'with_jpeg%': 'false'
          }, {
            'with_jpeg%': 'true'
          }]
        ]
      }
    }, {  # 'OS!="win"'
      'variables': {
        'with_jpeg%': '<!(node ./util/has_lib.js jpeg)',
        'with_gif%': '<!(node ./util/has_lib.js gif)',
        'with_rsvg%': '<!(node ./util/has_lib.js rsvg)'
      }
    }]
  ],
  'targets': [
    {
      'target_name': 'canvas-postbuild',
      'dependencies': ['canvas'],
      'conditions': [
        ['OS=="win"', {
          'copies': [{
            'destination': '<(PRODUCT_DIR)',
            'files': [
              '<(GTK_Root)/bin/zlib1.dll',
              '<(GTK_Root)/bin/libintl-8.dll',
              '<(GTK_Root)/bin/libpng14-14.dll',
              '<(GTK_Root)/bin/libpangocairo-1.0-0.dll',
              '<(GTK_Root)/bin/libpango-1.0-0.dll',
              '<(GTK_Root)/bin/libpangoft2-1.0-0.dll',
              '<(GTK_Root)/bin/libpangowin32-1.0-0.dll',
              '<(GTK_Root)/bin/libcairo-2.dll',
              '<(GTK_Root)/bin/libfontconfig-1.dll',
              '<(GTK_Root)/bin/libfreetype-6.dll',
              '<(GTK_Root)/bin/libglib-2.0-0.dll',
              '<(GTK_Root)/bin/libgobject-2.0-0.dll',
              '<(GTK_Root)/bin/libgmodule-2.0-0.dll',
              '<(GTK_Root)/bin/libgthread-2.0-0.dll',
              '<(GTK_Root)/bin/libexpat-1.dll'
            ]
          }]
        }]
      ]
    },
    {
      'target_name': 'canvas',
      'include_dirs': ["<!(node -p \"require('node-addon-api').include_dir\")"],
      'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS', 'NODE_ADDON_API_ENABLE_MAYBE' ],
      'sources': [
        'src/bmp/BMPParser.cc',
        'src/Canvas.cc',
        'src/CanvasGradient.cc',
        'src/CanvasPattern.cc',
        'src/CanvasRenderingContext2d.cc',
        'src/closure.cc',
        'src/color.cc',
        'src/Image.cc',
        'src/ImageData.cc',
        'src/init.cc',
        'src/register_font.cc',
        'src/FontParser.cc'
      ],
      'conditions': [
        ['OS=="win"', {
          'libraries': [
            '-l<(GTK_Root)/lib/cairo.lib',
            '-l<(GTK_Root)/lib/libpng.lib',
            '-l<(GTK_Root)/lib/pangocairo-1.0.lib',
            '-l<(GTK_Root)/lib/pango-1.0.lib',
            '-l<(GTK_Root)/lib/freetype.lib',
            '-l<(GTK_Root)/lib/glib-2.0.lib',
            '-l<(GTK_Root)/lib/gobject-2.0.lib'
          ],
          'include_dirs': [
            '<(GTK_Root)/include',
            '<(GTK_Root)/include/cairo',
            '<(GTK_Root)/include/pango-1.0',
            '<(GTK_Root)/include/glib-2.0',
            '<(GTK_Root)/include/freetype2',
            '<(GTK_Root)/lib/glib-2.0/include'
          ],
          'defines': [
            '_USE_MATH_DEFINES',  # for M_PI
            'NOMINMAX' # allow std::min/max to work
          ],
          'configurations': {
            'Debug': {
              'msvs_settings': {
                'VCCLCompilerTool': {
                  'WarningLevel': 4,
                  'ExceptionHandling': 1,
                  'DisableSpecificWarnings': [
                    4100, 4611
                  ]
                }
              }
            },
            'Release': {
              'msvs_settings': {
                'VCCLCompilerTool': {
                  'WarningLevel': 4,
                  'ExceptionHandling': 1,
                  'DisableSpecificWarnings': [
                    4100, 4611
                  ]
                }
              }
            }
          }
        }, {  # 'OS!="win"'
          'libraries': [
            '<!@(pkg-config pixman-1 --libs)',
            '<!@(pkg-config cairo --libs)',
            '<!@(pkg-config libpng --libs)',
            '<!@(pkg-config pangocairo --libs)',
            '<!@(pkg-config freetype2 --libs)'
          ],
          'include_dirs': [
            '<!@(pkg-config cairo --cflags-only-I | sed s/-I//g)',
            '<!@(pkg-config libpng --cflags-only-I | sed s/-I//g)',
            '<!@(pkg-config pangocairo --cflags-only-I | sed s/-I//g)',
            '<!@(pkg-config freetype2 --cflags-only-I | sed s/-I//g)'
          ],
          'cflags': ['-Wno-cast-function-type'],
          'cflags!': ['-fno-exceptions'],
          'cflags_cc!': ['-fno-exceptions']
        }],
        ['OS=="mac"', {
          'cflags+': ['-fvisibility=hidden'],
          'xcode_settings': {
            'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden
            'GCC_ENABLE_CPP_EXCEPTIONS': 'YES'
          }
        }],
        ['with_jpeg=="true"', {
          'defines': [
            'HAVE_JPEG'
          ],
          'conditions': [
            ['OS=="win"', {
              'copies': [{
                'destination': '<(PRODUCT_DIR)',
                'files': [
                  '<(jpeg_root)/bin/jpeg62.dll',
                ]
              }],
              'include_dirs': [
                '<(jpeg_root)/include'
              ],
              'libraries': [
                '-l<(jpeg_root)/lib/jpeg.lib',
              ]
            }, {
              'include_dirs': [
                '<!@(pkg-config libjpeg --cflags-only-I | sed s/-I//g)'
              ],
              'libraries': [
                '<!@(pkg-config libjpeg --libs)'
              ]
            }]
          ]
        }],
        ['with_gif=="true"', {
          'defines': [
            'HAVE_GIF'
          ],
          'conditions': [
            ['OS=="win"', {
              'libraries': [
                '-l<(GTK_Root)/lib/gif.lib'
              ]
            }, {
              'include_dirs': [
                '/opt/homebrew/include'
              ],
              'libraries': [
                '-L/opt/homebrew/lib',
                '-lgif'
              ]
            }]
          ]
        }],
        ['with_rsvg=="true"', {
          'defines': [
            'HAVE_RSVG'
          ],
          'conditions': [
            ['OS=="win"', {
              'copies': [{
                'destination': '<(PRODUCT_DIR)',
                'files': [
                  '<(GTK_Root)/bin/librsvg-2-2.dll',
                  '<(GTK_Root)/bin/libgdk_pixbuf-2.0-0.dll',
                  '<(GTK_Root)/bin/libgio-2.0-0.dll',
                  '<(GTK_Root)/bin/libcroco-0.6-3.dll',
                  '<(GTK_Root)/bin/libgsf-1-114.dll',
                  '<(GTK_Root)/bin/libxml2-2.dll'
                ]
              }],
              'libraries': [
                '-l<(GTK_Root)/lib/librsvg-2-2.lib'
              ]
            }, {
              'include_dirs': [
                '<!@(pkg-config librsvg-2.0 --cflags-only-I | sed s/-I//g)'
              ],
              'libraries': [
                '<!@(pkg-config librsvg-2.0 --libs)'
              ]
            }]
          ]
        }]
      ]
    }
  ]
}


================================================
FILE: browser.js
================================================
/* globals document, ImageData */

exports.createCanvas = function (width, height) {
  return Object.assign(document.createElement('canvas'), { width: width, height: height })
}

exports.createImageData = function (array, width, height) {
  // Browser implementation of ImageData looks at the number of arguments passed
  switch (arguments.length) {
    case 0: return new ImageData()
    case 1: return new ImageData(array)
    case 2: return new ImageData(array, width)
    default: return new ImageData(array, width, height)
  }
}

exports.loadImage = function (src, options) {
  return new Promise(function (resolve, reject) {
    const image = Object.assign(document.createElement('img'), options)

    function cleanup () {
      image.onload = null
      image.onerror = null
    }

    image.onload = function () { cleanup(); resolve(image) }
    image.onerror = function () { cleanup(); reject(new Error('Failed to load the image "' + src + '"')) }

    image.src = src
  })
}


================================================
FILE: examples/clock.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

function getX (angle) {
  return -Math.sin(angle + Math.PI)
}

function getY (angle) {
  return Math.cos(angle + Math.PI)
}

function clock (ctx) {
  let x, y, i
  const now = new Date()

  ctx.clearRect(0, 0, 320, 320)

  ctx.save()

  ctx.translate(160, 160)
  ctx.beginPath()
  ctx.lineWidth = 14
  ctx.strokeStyle = '#325FA2'
  ctx.fillStyle = '#eeeeee'
  ctx.arc(0, 0, 142, 0, Math.PI * 2, true)
  ctx.stroke()
  ctx.fill()

  // Hour marks
  ctx.lineWidth = 8
  ctx.strokeStyle = '#000000'
  for (i = 0; i < 12; i++) {
    x = getX(Math.PI / 6 * i)
    y = getY(Math.PI / 6 * i)
    ctx.beginPath()
    ctx.moveTo(x * 100, y * 100)
    ctx.lineTo(x * 125, y * 125)
    ctx.stroke()
  }

  // Minute marks
  ctx.lineWidth = 5
  ctx.strokeStyle = '#000000'
  for (i = 0; i < 60; i++) {
    if (i % 5 !== 0) {
      x = getX(Math.PI / 30 * i)
      y = getY(Math.PI / 30 * i)
      ctx.beginPath()
      ctx.moveTo(x * 117, y * 117)
      ctx.lineTo(x * 125, y * 125)
      ctx.stroke()
    }
  }

  const sec = now.getSeconds()
  const min = now.getMinutes()
  const hr = now.getHours() % 12

  ctx.fillStyle = 'black'

  // Write hours
  x = getX(hr * (Math.PI / 6) + (Math.PI / 360) * min + (Math.PI / 21600) * sec)
  y = getY(hr * (Math.PI / 6) + (Math.PI / 360) * min + (Math.PI / 21600) * sec)
  ctx.lineWidth = 14
  ctx.beginPath()
  ctx.moveTo(x * -20, y * -20)
  ctx.lineTo(x * 80, y * 80)
  ctx.stroke()

  // Write minutes
  x = getX((Math.PI / 30) * min + (Math.PI / 1800) * sec)
  y = getY((Math.PI / 30) * min + (Math.PI / 1800) * sec)

  ctx.lineWidth = 10
  ctx.beginPath()
  ctx.moveTo(x * -28, y * -28)
  ctx.lineTo(x * 112, y * 112)
  ctx.stroke()

  // Write seconds
  x = getX(sec * Math.PI / 30)
  y = getY(sec * Math.PI / 30)
  ctx.strokeStyle = '#D40000'
  ctx.fillStyle = '#D40000'
  ctx.lineWidth = 6
  ctx.beginPath()
  ctx.moveTo(x * -30, y * -30)
  ctx.lineTo(x * 83, y * 83)
  ctx.stroke()
  ctx.beginPath()
  ctx.arc(0, 0, 10, 0, Math.PI * 2, true)
  ctx.fill()
  ctx.beginPath()
  ctx.arc(x * 95, y * 95, 10, 0, Math.PI * 2, true)
  ctx.stroke()
  ctx.fillStyle = '#555'
  ctx.arc(0, 0, 3, 0, Math.PI * 2, true)
  ctx.fill()

  ctx.restore()
}

module.exports = clock

if (require.main === module) {
  const canvas = Canvas.createCanvas(320, 320)
  const ctx = canvas.getContext('2d')

  clock(ctx)

  canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'clock.png')))
}


================================================
FILE: examples/crop.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('canvas')

const img = new Canvas.Image()

img.onerror = function (err) {
  throw err
}

img.onload = function () {
  const w = img.width / 2
  const h = img.height / 2
  const canvas = Canvas.createCanvas(w, h)
  const ctx = canvas.getContext('2d')

  ctx.drawImage(img, 0, 0, w, h, 0, 0, w, h)

  const out = fs.createWriteStream(path.join(__dirname, 'crop.jpg'))
  const stream = canvas.createJPEGStream({
    bufsize: 2048,
    quality: 80
  })

  stream.pipe(out)
}

img.src = path.join(__dirname, 'images', 'squid.png')


================================================
FILE: examples/fill-evenodd.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const canvas = Canvas.createCanvas(100, 100)
const ctx = canvas.getContext('2d')

ctx.fillStyle = '#f00'
ctx.rect(0, 0, 100, 50)
ctx.arc(50, 50, 50, 0, 2 * Math.PI)
ctx.fill('evenodd')

canvas.createJPEGStream().pipe(fs.createWriteStream(path.join(__dirname, '/fill-evenodd.jpg')))


================================================
FILE: examples/font.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

function fontFile (name) {
  return path.join(__dirname, '/pfennigFont/', name)
}

// Pass each font, including all of its individual variants if there are any, to
// `registerFont`. When you set `ctx.font`, refer to the styles and the family
// name as it is embedded in the TTF. If you aren't sure, open the font in
// FontForge and visit Element -> Font Information and copy the Family Name
Canvas.registerFont(fontFile('Pfennig.ttf'), { family: 'pfennigFont' })
Canvas.registerFont(fontFile('PfennigBold.ttf'), { family: 'pfennigFont', weight: 'bold' })
Canvas.registerFont(fontFile('PfennigItalic.ttf'), { family: 'pfennigFont', style: 'italic' })
Canvas.registerFont(fontFile('PfennigBoldItalic.ttf'), { family: 'pfennigFont', weight: 'bold', style: 'italic' })

const canvas = Canvas.createCanvas(320, 320)
const ctx = canvas.getContext('2d')

ctx.font = 'normal normal 50px Helvetica'

ctx.fillText('Quo Vaids?', 0, 70)

ctx.font = 'bold 50px pfennigFont'
ctx.fillText('Quo Vaids?', 0, 140, 100)

ctx.font = 'italic 50px pfennigFont'
ctx.fillText('Quo Vaids?', 0, 210)

ctx.font = 'bold italic 50px pfennigFont'
ctx.fillText('Quo Vaids?', 0, 280)

canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'font.png')))


================================================
FILE: examples/globalAlpha.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const canvas = Canvas.createCanvas(150, 150)
const ctx = canvas.getContext('2d')

ctx.fillStyle = '#FD0'
ctx.fillRect(0, 0, 75, 75)

ctx.fillStyle = '#6C0'
ctx.fillRect(75, 0, 75, 75)

ctx.fillStyle = '#09F)'
ctx.fillRect(0, 75, 75, 75)

ctx.fillStyle = '#F30'
ctx.fillRect(75, 75, 150, 150)

ctx.fillStyle = '#FFF'

// set transparency value
ctx.globalAlpha = 0.2

// Draw semi transparent circles
for (let i = 0; i < 7; i++) {
  ctx.beginPath()
  ctx.arc(75, 75, 10 + 10 * i, 0, Math.PI * 2, true)
  ctx.fill()
}

canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'globalAlpha.png')))


================================================
FILE: examples/gradients.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const canvas = Canvas.createCanvas(320, 320)
const ctx = canvas.getContext('2d')

// Create gradients
const lingrad = ctx.createLinearGradient(0, 0, 0, 150)
lingrad.addColorStop(0, '#00ABEB')
lingrad.addColorStop(0.5, '#fff')
lingrad.addColorStop(0.5, '#26C000')
lingrad.addColorStop(1, '#fff')

const lingrad2 = ctx.createLinearGradient(0, 50, 0, 95)
lingrad2.addColorStop(0.5, '#000')
lingrad2.addColorStop(1, 'rgba(0,0,0,0)')

// assign gradients to fill and stroke styles
ctx.fillStyle = lingrad
ctx.strokeStyle = lingrad2

// draw shapes
ctx.fillRect(10, 10, 130, 130)
ctx.strokeRect(50, 50, 50, 50)

canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'gradients.png')))


================================================
FILE: examples/grayscale-image.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const Image = Canvas.Image
const canvas = Canvas.createCanvas(288, 288)
const ctx = canvas.getContext('2d')

const img = new Image()
img.onload = () => {
  ctx.drawImage(img, 0, 0)
  canvas.createJPEGStream().pipe(fs.createWriteStream(path.join(__dirname, 'passedThroughGrayscale.jpg')))
}
img.onerror = err => {
  throw err
}

img.src = path.join(__dirname, 'images', 'grayscaleImage.jpg')


================================================
FILE: examples/image-caption-overlay.js
================================================
import { createWriteStream } from 'fs'
import pify from 'pify'
import imageSizeOf from 'image-size'
import { createCanvas, loadImage, Image } from 'canvas'

const imageSizeOfP = pify(imageSizeOf)

function createImageFromBuffer (buffer) {
  const image = new Image()
  image.src = buffer

  return image
}

function createCaptionOverlay ({
  text,
  width,
  height,
  font = 'Arial',
  fontSize = 48,
  captionHeight = 120,
  decorateCaptionTextFillStyle = null,
  decorateCaptionFillStyle = null,
  offsetX = 0,
  offsetY = 0
}) {
  const canvas = createCanvas(width, height)
  const ctx = canvas.getContext('2d')

  const createGradient = (first, second) => {
    const grd = ctx.createLinearGradient(width, captionY, width, height)
    grd.addColorStop(0, first)
    grd.addColorStop(1, second)

    return grd
  }

  // Hold computed caption position
  const captionX = offsetX
  const captionY = offsetY + height - captionHeight
  const captionTextX = captionX + (width / 2)
  const captionTextY = captionY + (captionHeight / 2)

  // Fill caption rect
  ctx.fillStyle = decorateCaptionFillStyle
    ? decorateCaptionFillStyle(ctx)
    : createGradient('rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0.45)')
  ctx.fillRect(captionX, captionY, width, captionHeight)

  // Fill caption text
  ctx.textBaseline = 'middle'
  ctx.textAlign = 'center'
  ctx.font = `${fontSize}px ${font}`
  ctx.fillStyle = decorateCaptionTextFillStyle
    ? decorateCaptionTextFillStyle(ctx)
    : 'white'
  ctx.fillText(text, captionTextX, captionTextY)

  return createImageFromBuffer(canvas.toBuffer())
}

(async () => {
  try {
    const source = 'images/lime-cat.jpg'
    const { width, height } = await imageSizeOfP(source)
    const canvas = createCanvas(width, height)
    const ctx = canvas.getContext('2d')

    // Draw base image
    const image = await loadImage(source)
    ctx.drawImage(image, 0, 0)

    // Draw caption overlay
    const overlay = await createCaptionOverlay({
      text: 'Hello!',
      width,
      height
    })
    ctx.drawImage(overlay, 0, 0)

    // Output to `.png` file
    canvas.createPNGStream().pipe(createWriteStream('foo.png'))
  } catch (err) {
    console.log(err)
    process.exit(1)
  }
})()


================================================
FILE: examples/image-src-svg.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const canvas = Canvas.createCanvas(500, 500)
const ctx = canvas.getContext('2d')
ctx.fillStyle = 'white'
ctx.fillRect(0, 0, 500, 500)

Canvas.loadImage(path.join(__dirname, 'images', 'small-svg.svg'))
  .then(image => {
    image.width *= 1.5
    image.height *= 1.5
    ctx.drawImage(image, canvas.width / 2 - image.width / 2, canvas.height / 2 - image.height / 2)

    canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'image-src-svg.png')))
  })
  .catch(e => console.error(e))


================================================
FILE: examples/image-src-url.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const Image = Canvas.Image
const canvas = Canvas.createCanvas(200, 300)
const ctx = canvas.getContext('2d')

const img = new Image()
img.onload = () => {
  ctx.drawImage(img, 0, 0)
  canvas.createPNGStream()
    .pipe(fs.createWriteStream(path.join(__dirname, 'image-src-url.png')))
}
img.onerror = err => {
  console.log(err)
}
img.src = 'http://picsum.photos/200/300'


================================================
FILE: examples/image-src.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const Image = Canvas.Image
const canvas = Canvas.createCanvas(200, 200)
const ctx = canvas.getContext('2d')

ctx.fillRect(0, 0, 150, 150)
ctx.save()

ctx.fillStyle = '#09F'
ctx.fillRect(15, 15, 120, 120)

ctx.save()
ctx.fillStyle = '#FFF'
ctx.globalAlpha = 0.5
ctx.fillRect(30, 30, 90, 90)

ctx.restore()
ctx.fillRect(45, 45, 60, 60)

ctx.restore()
ctx.fillRect(60, 60, 30, 30)

const img = new Image()
img.onerror = err => { throw err }
img.onload = () => {
  img.src = canvas.toBuffer()
  ctx.drawImage(img, 0, 0, 50, 50)
  ctx.drawImage(img, 50, 0, 50, 50)
  ctx.drawImage(img, 100, 0, 50, 50)

  const img2 = new Image()
  img2.onload = () => {
    ctx.drawImage(img2, 30, 50, img2.width / 4, img2.height / 4)
    canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'image-src.png')))
  }
  img2.onerror = err => { throw err }
  img2.src = path.join(__dirname, 'images', 'squid.png')
}


================================================
FILE: examples/indexed-png-alpha.js
================================================
const Canvas = require('..')
const fs = require('fs')
const path = require('path')
const canvas = Canvas.createCanvas(200, 200)
const ctx = canvas.getContext('2d', { pixelFormat: 'A8' })

// Matches the "fillStyle" browser test, made by using alpha fillStyle value
const palette = new Uint8ClampedArray(37 * 4)
let i, j
let k = 0
// First value is opaque white:
palette[k++] = 255
palette[k++] = 255
palette[k++] = 255
palette[k++] = 255
for (i = 0; i < 6; i++) {
  for (j = 0; j < 6; j++) {
    palette[k++] = Math.floor(255 - 42.5 * i)
    palette[k++] = Math.floor(255 - 42.5 * j)
    palette[k++] = 0
    palette[k++] = 255
  }
}
for (i = 0; i < 6; i++) {
  for (j = 0; j < 6; j++) {
    const index = i * 6 + j + 1.5 // 0.5 to bias rounding
    const fraction = index / 255
    ctx.fillStyle = 'rgba(0,0,0,' + fraction + ')'
    ctx.fillRect(j * 25, i * 25, 25, 25)
  }
}

canvas.createPNGStream({ palette: palette })
  .pipe(fs.createWriteStream(path.join(__dirname, 'indexed2.png')))


================================================
FILE: examples/indexed-png-image-data.js
================================================
const Canvas = require('..')
const fs = require('fs')
const path = require('path')
const canvas = Canvas.createCanvas(200, 200)
const ctx = canvas.getContext('2d', { pixelFormat: 'A8' })

// Matches the "fillStyle" browser test, made by manipulating imageData
const palette = new Uint8ClampedArray(37 * 4)
let k = 0
let i, j
// First value is opaque white:
palette[k++] = 255
palette[k++] = 255
palette[k++] = 255
palette[k++] = 255
for (i = 0; i < 6; i++) {
  for (j = 0; j < 6; j++) {
    palette[k++] = Math.floor(255 - 42.5 * i)
    palette[k++] = Math.floor(255 - 42.5 * j)
    palette[k++] = 0
    palette[k++] = 255
  }
}
const idata = ctx.getImageData(0, 0, 200, 200)
for (i = 0; i < 6; i++) {
  for (j = 0; j < 6; j++) {
    const index = j * 6 + i
    // fill rect:
    for (let xr = j * 25; xr < j * 25 + 25; xr++) {
      for (let yr = i * 25; yr < i * 25 + 25; yr++) {
        idata.data[xr * 200 + yr] = index + 1
      }
    }
  }
}
ctx.putImageData(idata, 0, 0)

canvas.createPNGStream({ palette: palette })
  .pipe(fs.createWriteStream(path.join(__dirname, 'indexed.png')))


================================================
FILE: examples/kraken.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const Image = Canvas.Image
const canvas = Canvas.createCanvas(400, 267)
const ctx = canvas.getContext('2d')

const img = new Image()

img.onload = function () {
  ctx.drawImage(img, 0, 0)
}

img.onerror = err => { throw err }

img.src = path.join(__dirname, 'images', 'squid.png')

const sigma = 10 // radius
let kernel, kernelSize, kernelSum

function buildKernel () {
  let i, j, g
  const ss = sigma * sigma
  const factor = 2 * Math.PI * ss

  kernel = [[]]

  i = 0
  do {
    g = Math.exp(-(i * i) / (2 * ss)) / factor
    if (g < 1e-3) break
    kernel[0].push(g)
    ++i
  } while (i < 7)

  kernelSize = i
  for (j = 1; j < kernelSize; ++j) {
    kernel.push([])
    for (i = 0; i < kernelSize; ++i) {
      g = Math.exp(-(i * i + j * j) / (2 * ss)) / factor
      kernel[j].push(g)
    }
  }

  kernelSum = 0
  for (j = 1 - kernelSize; j < kernelSize; ++j) {
    for (i = 1 - kernelSize; i < kernelSize; ++i) {
      kernelSum += kernel[Math.abs(j)][Math.abs(i)]
    }
  }
}

function blurTest () {
  let x, y, i, j
  let r, g, b, a

  console.log('... running')

  const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height)
  const data = imgData.data
  const width = imgData.width
  const height = imgData.height

  const startTime = (new Date()).getTime()

  for (y = 0; y < height; ++y) {
    for (x = 0; x < width; ++x) {
      r = 0
      g = 0
      b = 0
      a = 0

      for (j = 1 - kernelSize; j < kernelSize; ++j) {
        if (y + j < 0 || y + j >= height) continue

        for (i = 1 - kernelSize; i < kernelSize; ++i) {
          if (x + i < 0 || x + i >= width) continue

          r += data[4 * ((y + j) * width + (x + i)) + 0] * kernel[Math.abs(j)][Math.abs(i)]
          g += data[4 * ((y + j) * width + (x + i)) + 1] * kernel[Math.abs(j)][Math.abs(i)]
          b += data[4 * ((y + j) * width + (x + i)) + 2] * kernel[Math.abs(j)][Math.abs(i)]
          a += data[4 * ((y + j) * width + (x + i)) + 3] * kernel[Math.abs(j)][Math.abs(i)]
        }
      }

      data[4 * (y * width + x) + 0] = r / kernelSum
      data[4 * (y * width + x) + 1] = g / kernelSum
      data[4 * (y * width + x) + 2] = b / kernelSum
      data[4 * (y * width + x) + 3] = a / kernelSum
    }
  }

  const finishTime = Date.now() - startTime
  for (i = 0; i < data.length; i++) {
    imgData.data[i] = data[i]
  }

  ctx.putImageData(imgData, 0, 0)
  console.log('... finished in %dms', finishTime)
}

buildKernel()
blurTest()

canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'kraken.png')))


================================================
FILE: examples/live-clock.js
================================================
const http = require('http')
const Canvas = require('..')

const clock = require('./clock')

const canvas = Canvas.createCanvas(320, 320)
const ctx = canvas.getContext('2d')

http.createServer(function (req, res) {
  clock(ctx)

  res.writeHead(200, { 'Content-Type': 'text/html' })
  res.end(
    '<meta http-equiv="refresh" content="1;" />' +
    '<img src="' + canvas.toDataURL() + '" />'
  )
}).listen(3000, function () {
  console.log('Server started on port 3000')
})


================================================
FILE: examples/multi-page-pdf.js
================================================
const fs = require('fs')
const Canvas = require('..')

const canvas = Canvas.createCanvas(500, 500, 'pdf')
const ctx = canvas.getContext('2d')

let x, y

function reset () {
  x = 50
  y = 80
}

function h1 (str) {
  ctx.font = '22px Helvetica'
  ctx.fillText(str, x, y)
}

function p (str) {
  ctx.font = '10px Arial'
  ctx.fillText(str, x, (y += 20))
}

reset()
h1('PDF demo')
p('Multi-page PDF demonstration')
ctx.addPage()

reset()
h1('Page #2')
p('This is the second page')
ctx.addPage(250, 250) // create a page with half the size of the canvas

reset()
h1('Page #3')
p('This is the third page')

fs.writeFile('out.pdf', canvas.toBuffer(), function (err) {
  if (err) throw err

  console.log('created out.pdf')
})


================================================
FILE: examples/pango-glyphs.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const canvas = Canvas.createCanvas(400, 100)
const ctx = canvas.getContext('2d')

ctx.globalAlpha = 1
ctx.font = 'normal 16px Impact'

ctx.textBaseline = 'top'

// Note this demo depends node-canvas being installed with pango support,
// and your system having installed fonts supporting the glyphs.

ctx.fillStyle = '#000'
ctx.fillText('English: Some text in Impact.', 10, 10)
ctx.fillText('Japanese: 図書館の中では、静かにする。', 10, 30)
ctx.fillText('Arabic: اللغة العربية هي أكثر اللغات تحدثا ضمن', 10, 50)
ctx.fillText('Korean: 모타는사라미 못하는 사람이', 10, 70)

canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'pango-glyphs.png')))


================================================
FILE: examples/pdf-images.js
================================================
const fs = require('fs')
const { Image, createCanvas } = require('..')

const canvas = createCanvas(500, 500, 'pdf')
const ctx = canvas.getContext('2d')

let x, y

function reset () {
  x = 50
  y = 80
}

function h1 (str) {
  ctx.font = '22px Helvetica'
  ctx.fillText(str, x, y)
}

function p (str) {
  ctx.font = '10px Arial'
  ctx.fillText(str, x, (y += 20))
}

function img (src) {
  const img = new Image()
  img.src = src
  ctx.drawImage(img, x, (y += 20))
  y += img.height
}

reset()
h1('PDF image demo')
p('This is an image embedded in a PDF')
img('examples/images/squid.png')
p('Figure 1.0 - Some squid thing')
ctx.addPage()

reset()
h1('Lime cat')
p('This is a pretty sweet cat')
img('examples/images/lime-cat.jpg')
p('Figure 1.1 - Lime cat is awesome')
ctx.addPage()

const buff = canvas.toBuffer('application/pdf', {
  title: 'Squid and Cat!',
  author: 'Octocat',
  subject: 'An example PDF made with node-canvas',
  keywords: 'node.js squid cat lime',
  creator: 'my app',
  modDate: new Date()
})

fs.writeFile('out.pdf', buff, function (err) {
  if (err) throw err

  console.log('created out.pdf')
})


================================================
FILE: examples/pdf-link.js
================================================
const fs = require('fs')
const path = require('path')
const Canvas = require('..')

const canvas = Canvas.createCanvas(400, 300, 'pdf')
const ctx = canvas.getContext('2d')

ctx.beginTag('Link', 'uri=\'https://google.com\'')
ctx.font = '22px Helvetica'
ctx.fillText('Text link to Google', 110, 50)
ctx.endTag('Link')

ctx.fillText('Rect link to node-canvas below!', 40, 180)

ctx.beginTag('Link', 'uri=\'https://github.com/Automattic/node-canvas\' rect=[0 200 400 100]')
ctx.endTag('Link')

fs.writeFile(path.join(__dirname, 'pdf-link.pdf'), canvas.toBuffer(), function (err) {
  if (err) throw err
})


================================================
FILE: examples/pfennigFont/FONTLOG.txt
================================================
FONTLOG
Pfennig font family
==========================

This file provides detailed information on the Pfennig family of fonts.
This information should be distributed along with the Pfennig fonts and
any derivative works.


Basic Font Information
----------------------

Pfennig is a sans-serif font with support for Latin, Cyrillic, Greek and Hebrew
character sets. It contains sufficient characters for Latin-0 through Latin-10,
as well as all modern Cyrillic scripts, the full Vietnamese range, modern Greek,
modern Hebrew, and the Pan-African Alphabet.  It supports the standard Roman
ligatures and uses OpenType tables for diacritic placement.

Pfennig supports the following Unicode ranges:

Range          Description            Coverage
..............................................
U+0020-U+007F  Basic Latin            Full
U+00A0-U+00FF  Latin-1 Supplement     Full
U+0100-U+017F  Latin Extended-A       Full
U+0180-U+024F  Latin Extended-B       146/208
U+0250-U+02AF  IPA Extensions         32/96
U+02B0-U+02FF  Spacing Modifiers      18/80
U+0300-U+036F  Combining Diacritics   34/112
U+0370-U+03FF  Greek                  74/134
U+0400-U+04FF  Cyrillic               214/256
U+0500-U+052F  Cyrillic Supplement    14/44
U+0590-U+05FF  Hebrew                 27/87
U+1DC0-U+1DFF  Comb. Diacritic Supp.  4/43
U+1E00-U+1EFF  Latin Extended Add'l   173/256
U+2000-U+206F  General Punctuation    19/107
U+2070-U+209F  Super/Subscripts	      1/42
U+20A0-U+20CF  Currency Symbols       1/26 (Euro sign only)
U+2100-U+214F  Letterlike Symbols     2/80
U+2200-U+22FF  Mathematical Operators 2/256
U+25A0-U+25FF  Geometric Shapes       1/96 (Dotted circle only)
U+2C60-U+2C7F  Latin Extended-C       5/32
U+A720-U+A7FF  Latin Extended-D       5/129
U+FB00-U+FB06  Latin Ligatures        5/7 (all except archaic ligatures)

ChangeLog
---------

2012-04-10  Added Cyrillic glyphs for Orok, Khanty, Nenets (in Unicode
            pipeline)
2012-04-07  Improved AE ligature and U+A78D; added a few glyphs with
            diacritics.
2011-09-24  Added a few African Latin glyphs; improved Cyrillic breve; major
            spacing improvements in italics; improved TTF hints.
2010-08-31  Further refinements of Vietnamese range in all faces.
2010-08-04  Added several obscure African letters.  Corrected some stacked
            diacritics. Corrected proposed codepoint for H with hook.
2010-06-23  Added modern Hebrew and Greek ranges
2010-06-17  Added all anchors needed for diacritic attachment for
            Pan-African to upright fonts; italic fonts are by nature unsuitable
            for Pan-African due to stylistic clashes (e.g. between a and alpha).
            Improved lowercase thorn in all fonts. Added dropped umlaut on A, O
            and U in upright fonts, accessible as ss01.
2010-06-04  Finished up requirements for Pan-African Alphabet;
            improved Vietnamese italic & bold-italic
2010-04-23  Completed support for all Cyrillic codepoints for modern
            orthographies.
2010-04-14  More glyphs: African, modern Pinyin, Amerindian
2010-04-12  Moved non-Unicode glyphs to PUA; added a few more African
            glyphs.
2010-04-06  Diacritic improvement in Bold Vietnamese. Additional glyphs
            for Skolt Sami, the Pan-Nigerian Alphabet, and various other
            African languages.
2010-03-31  Further spacing enhancements in non-italic. Improvements in
            Vietnamese range in Medium to prevent excessive diacritic
            height. Spacing improvements in italic ligatures.
2009-09-18  Major overhaul of spacing in non-italic
2009-08-06  Added Vietnamese range.
2009-07-30  Kerned Latin ranges.
2009-07-29  Added Cyrillic range.
2009-07-24  Initial release


Information for Contributors
----------------------------

This font is licensed under the Open Font License (OFL).  There is no Reserved
Name clause for the Pfennig font, enabling the free conversion between font
formats.

You can read more about the OFL here:
http://scripts.sil.org/OFL

If you'd like to make changes to the original font, you are free to contact
the author of the original font (for contact information, please see the
"Contributors" section below).  Glyph changes should be in a FontForge .sfd
file (please make sure your version of FontForge is reasonably up-to-date).
Please send *only* the changed glyphs, not the entire font range.  The author
reserves the right to reject or modify any contributions.  If your contribution
is accepted, your name will appear in the Contributors section (unless you
specify otherwise).


Contributors
------------

Daniel Johnson (font maintainer)
il.basso.buffo at gmail dot com


================================================
FILE: examples/pfennigFont/OFL.txt
================================================
Copyright (c) 2009 - 2012 Daniel Johnson (<il.basso.buffo@gmail.com>).

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded, 
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.


================================================
FILE: examples/pfennigFont/Pfennig.sfd
================================================
SplineFontDB: 3.0
FontName: Pfennig
FullName: Pfennig
FamilyName: Pfennig
Weight: Medium
Copyright: Copyright 2009-2012 by Daniel Johnson. Released under the terms of the SIL Open Font License.
UComments: "2009-7-16: Created." 
Version: 20120410
ItalicAngle: 0
UnderlinePosition: -204
UnderlineWidth: 102
Ascent: 1638
Descent: 410
LayerCount: 2
Layer: 0 0 "Back"  1
Layer: 1 1 "Fore"  0
NeedsXUIDChange: 1
XUID: [1021 1003 1579404955 6722392]
FSType: 0
OS2Version: 0
OS2_WeightWidthSlopeOnly: 0
OS2_UseTypoMetrics: 1
CreationTime: 1247766582
ModificationTime: 1334085823
PfmFamily: 33
TTFWeight: 500
TTFWidth: 5
LineGap: 0
VLineGap: 0
OS2TypoAscent: 2174
OS2TypoAOffset: 0
OS2TypoDescent: -531
OS2TypoDOffset: 0
OS2TypoLinegap: 0
OS2WinAscent: 2174
OS2WinAOffset: 0
OS2WinDescent: 531
OS2WinDOffset: 0
HheadAscent: 2174
HheadAOffset: 0
HheadDescent: -531
HheadDOffset: 0
OS2FamilyClass: 2050
OS2Vendor: 'PfEd'
Lookup: 1 0 0 "'ss01' Style Set 1 in Latin"  {"'ss01' Style Set 1 in Latin-1"  } ['ss01' ('latn' <'dflt' > ) ]
Lookup: 1 0 0 "'locl' Localized Forms for Sami"  {"'locl' Localized Forms for Sami-1"  } ['locl' ('latn' <'LSM ' > 'latn' <'NSM ' > 'latn' <'SKS ' > ) ]
Lookup: 4 0 1 "'liga' Standard Ligatures in Latin lookup 0"  {"'liga' Standard Ligatures in Latin lookup 0-1"  } ['liga' ('DFLT' <'dflt' > 'latn' <'dflt' > ) ]
Lookup: 262 0 0 "'mkmk' Mark to Mark lookup 2"  {"'mkmk' Mark to Mark lookup 2-1"  } ['mkmk' ('DFLT' <'dflt' > 'cyrl' <'dflt' > 'latn' <'LSM ' 'NSM ' 'SKS ' 'dflt' > ) ]
Lookup: 258 0 0 "'kern' Horizontal Kerning lookup 1"  {"'kern' Horizontal Kerning lookup 1-1"  } ['kern' ('DFLT' <'dflt' > 'cyrl' <'dflt' > 'latn' <'dflt' > ) ]
Lookup: 260 0 0 "'mark' Mark Positioning in Latin lookup 0"  {"'mark' Mark Positioning in Latin lookup 0-1"  } ['mark' ('DFLT' <'dflt' > 'latn' <'dflt' > ) ]
MarkAttachClasses: 1
DEI: 91125
KernClass2: 9 9 "'kern' Horizontal Kerning lookup 1-1" 
 109 A L Agrave Aacute Acircumflex Atilde Adieresis Aring Amacron Abreve Aogonek Lacute Lcommaaccent Lcaron Lslash
 529 B C E G H I J K M N R S U X Z Ccedilla Egrave Eacute Ecircumflex Edieresis Ntilde Ugrave Uacute Ucircumflex Udieresis Cacute Ccircumflex Cdotaccent Ccaron Emacron Edotaccent Eogonek Ecaron Gcircumflex Gbreve Gdotaccent Gcommaaccent Hcircumflex Hbar Itilde Imacron Iogonek Idotaccent Jcircumflex Kcommaaccent Nacute Ncommaaccent Ncaron Eng OE Racute Rcommaaccent Rcaron Sacute Scircumflex Scedilla Scaron Utilde Umacron Ubreve Uring Uhungarumlaut Uogonek Zacute Zdotaccent Zcaron Scommaaccent uni1E02 uni1E40 uni1E60 Ebreve Ibreve
 122 D O Eth Ograve Oacute Ocircumflex Otilde Odieresis Oslash Thorn Dcaron Dcroat Omacron Ohungarumlaut uni01EA uni1E0A Obreve
 152 F P T V W Y Yacute Tcommaaccent Tcaron Tbar Wcircumflex Ycircumflex Ydieresis uni021A uni1E1E uni1E56 uni1E6A Wgrave Wacute Wdieresis Ygrave Ohorn Uhorn
 551 a c g h i j k m n q s u x z agrave aacute acircumflex atilde adieresis aring ccedilla igrave iacute icircumflex idieresis ntilde ugrave uacute ucircumflex udieresis amacron abreve aogonek cacute ccircumflex cdotaccent ccaron gcircumflex gbreve gdotaccent gcommaaccent hcircumflex hbar itilde imacron iogonek dotlessi jcircumflex kcommaaccent kgreenlandic nacute ncommaaccent ncaron eng sacute scircumflex scedilla scaron utilde umacron ubreve uring uhungarumlaut uogonek zacute zdotaccent zcaron scommaaccent uni0237 uni1E41 uni1E61 ohorn uhorn ibreve
 200 b e o p egrave eacute ecircumflex edieresis eth ograve oacute ocircumflex otilde odieresis oslash thorn emacron edotaccent eogonek ecaron omacron ohungarumlaut oe uni01EB uni1E03 uni1E57 ebreve obreve
 153 d f l t germandbls dcaron dcroat lacute lcommaaccent lcaron lslash tcommaaccent tcaron tbar uni021B uni1E0B uni1E1F uni1E6B uniFB00 fi fl uniFB03 uniFB04
 112 r v w y yacute ydieresis racute rcommaaccent rcaron wcircumflex ycircumflex longs wgrave wacute wdieresis ygrave
 90 A J Agrave Aacute Acircumflex Atilde Adieresis Aring AE Amacron Abreve Aogonek Jcircumflex
 551 B D E F H I K L M N P R S U X Z Egrave Eacute Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde Ugrave Uacute Ucircumflex Udieresis Thorn Dcaron Dcroat Emacron Edotaccent Eogonek Ecaron Hcircumflex Hbar Itilde Imacron Iogonek Idotaccent Kcommaaccent Lacute Lcommaaccent Lcaron Lslash Nacute Ncommaaccent Ncaron Eng Racute Rcommaaccent Rcaron Sacute Scircumflex Scedilla Scaron Utilde Umacron Ubreve Uring Uhungarumlaut Uogonek Zacute Zdotaccent Zcaron Scommaaccent uni1E02 uni1E0A uni1E1E uni1E40 uni1E56 uni1E60 Uhorn Ebreve Ibreve
 192 C G O Q Ccedilla Ograve Oacute Ocircumflex Otilde Odieresis Oslash Cacute Ccircumflex Cdotaccent Ccaron Gcircumflex Gbreve Gdotaccent Gcommaaccent Omacron Ohungarumlaut OE uni01EA Ohorn Obreve
 113 T V W Y Tcommaaccent Tcaron Tbar Wcircumflex Ycircumflex Ydieresis uni021A uni1E6A Wgrave Wacute Wdieresis Ygrave
 450 a i j m n p r s u x z agrave aacute acircumflex atilde adieresis aring ae igrave iacute icircumflex idieresis ntilde ugrave uacute ucircumflex udieresis amacron abreve aogonek itilde imacron iogonek dotlessi jcircumflex kgreenlandic nacute ncommaaccent ncaron eng racute rcommaaccent rcaron sacute scircumflex scedilla scaron utilde umacron ubreve uring uhungarumlaut uogonek zacute zdotaccent zcaron scommaaccent uni0237 uni1E41 uni1E61 uhorn ibreve
 185 b f h k l t germandbls thorn hcircumflex hbar kcommaaccent lacute lcommaaccent lcaron lslash tcommaaccent tcaron tbar longs uni021B uni1E03 uni1E1F uni1E6B uniFB00 fi fl uniFB03 uniFB04
 299 c d e g o q ccedilla egrave eacute ecircumflex edieresis eth ograve oacute ocircumflex otilde odieresis oslash cacute ccircumflex cdotaccent ccaron dcaron dcroat emacron edotaccent eogonek ecaron gcircumflex gbreve gdotaccent gcommaaccent omacron ohungarumlaut oe uni01EB uni1E0B ohorn ebreve obreve
 77 v w y yacute ydieresis wcircumflex ycircumflex wgrave wacute wdieresis ygrave
 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} -61 {} -123 {} 0 {} 0 {} 0 {} -61 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} -41 {} 0 {} 0 {} -41 {} 0 {} 0 {} 0 {} 0 {} 0 {} -164 {} 41 {} 0 {} 82 {} -41 {} 61 {} -123 {} 0 {} 0 {} 0 {} 0 {} 0 {} -123 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} -164 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} 0 {} -123 {} 0 {} 0 {} -123 {} 0 {} 0 {} 0 {} 0 {}
TtTable: prep
PUSHW_1
 511
SCANCTRL
PUSHB_1
 4
SCANTYPE
EndTTInstrs
LangName: 1033 "" "" "" "" "" "" "" "" "" "" "" "" "" "Copyright (c) 2009, Daniel Johnson (<il.basso.buffo@gmail.com>),+AAoA-with Reserved Font Name Pfennig.+AAoACgAA-This Font Software is licensed under the SIL Open Font License, Version 1.1.+AAoA-This license is copied below, and is also available with a FAQ at:+AAoA-http://scripts.sil.org/OFL+AAoACgAK------------------------------------------------------------+AAoA-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007+AAoA------------------------------------------------------------+AAoACgAA-PREAMBLE+AAoA-The goals of the Open Font License (OFL) are to stimulate worldwide+AAoA-development of collaborative font projects, to support the font creation+AAoA-efforts of academic and linguistic communities, and to provide a free and+AAoA-open framework in which fonts may be shared and improved in partnership+AAoA-with others.+AAoACgAA-The OFL allows the licensed fonts to be used, studied, modified and+AAoA-redistributed freely as long as they are not sold by themselves. The+AAoA-fonts, including any derivative works, can be bundled, embedded, +AAoA-redistributed and/or sold with any software provided that any reserved+AAoA-names are not used by derivative works. The fonts and derivatives,+AAoA-however, cannot be released under any other type of license. The+AAoA-requirement for fonts to remain under this license does not apply+AAoA-to any document created using the fonts or their derivatives.+AAoACgAA-DEFINITIONS+AAoAIgAA-Font Software+ACIA refers to the set of files released by the Copyright+AAoA-Holder(s) under this license and clearly marked as such. This may+AAoA-include source files, build scripts and documentation.+AAoACgAi-Reserved Font Name+ACIA refers to any names specified as such after the+AAoA-copyright statement(s).+AAoACgAi-Original Version+ACIA refers to the collection of Font Software components as+AAoA-distributed by the Copyright Holder(s).+AAoACgAi-Modified Version+ACIA refers to any derivative made by adding to, deleting,+AAoA-or substituting -- in part or in whole -- any of the components of the+AAoA-Original Version, by changing formats or by porting the Font Software to a+AAoA-new environment.+AAoACgAi-Author+ACIA refers to any designer, engineer, programmer, technical+AAoA-writer or other person who contributed to the Font Software.+AAoACgAA-PERMISSION & CONDITIONS+AAoA-Permission is hereby granted, free of charge, to any person obtaining+AAoA-a copy of the Font Software, to use, study, copy, merge, embed, modify,+AAoA-redistribute, and sell modified and unmodified copies of the Font+AAoA-Software, subject to the following conditions:+AAoACgAA-1) Neither the Font Software nor any of its individual components,+AAoA-in Original or Modified Versions, may be sold by itself.+AAoACgAA-2) Original or Modified Versions of the Font Software may be bundled,+AAoA-redistributed and/or sold with any software, provided that each copy+AAoA-contains the above copyright notice and this license. These can be+AAoA-included either as stand-alone text files, human-readable headers or+AAoA-in the appropriate machine-readable metadata fields within text or+AAoA-binary files as long as those fields can be easily viewed by the user.+AAoACgAA-3) No Modified Version of the Font Software may use the Reserved Font+AAoA-Name(s) unless explicit written permission is granted by the corresponding+AAoA-Copyright Holder. This restriction only applies to the primary font name as+AAoA-presented to the users.+AAoACgAA-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font+AAoA-Software shall not be used to promote, endorse or advertise any+AAoA-Modified Version, except to acknowledge the contribution(s) of the+AAoA-Copyright Holder(s) and the Author(s) or with their explicit written+AAoA-permission.+AAoACgAA-5) The Font Software, modified or unmodified, in part or in whole,+AAoA-must be distributed entirely under this license, and must not be+AAoA-distributed under any other license. The requirement for fonts to+AAoA-remain under this license does not apply to any document created+AAoA-using the Font Software.+AAoACgAA-TERMINATION+AAoA-This license becomes null and void if any of the above conditions are+AAoA-not met.+AAoACgAA-DISCLAIMER+AAoA-THE FONT SOFTWARE IS PROVIDED +ACIA-AS IS+ACIA, WITHOUT WARRANTY OF ANY KIND,+AAoA-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF+AAoA-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT+AAoA-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE+AAoA-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,+AAoA-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL+AAoA-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING+AAoA-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM+AAoA-OTHER DEALINGS IN THE FONT SOFTWARE." "http://scripts.sil.org/OFL" 
GaspTable: 1 65535 3
Encoding: UnicodeBmp
Compacted: 1
UnicodeInterp: none
NameList: Adobe Glyph List
DisplaySize: -48
AntiAlias: 1
FitToEm: 1
WinInfo: 756 18 11
BeginPrivate: 1
BlueValues 35 [-20 0 901 922 1352 1352 1434 1454]
EndPrivate
Grid
-90.1123 1085.44 m 17
 2228.22 1085.44 l 9
-90.1123 1433.6 m 25
 2228.22 1433.6 l 25
-90.1123 901.12 m 17
 2228.22 901.12 l 9
-90.1123 1351.68 m 25
 2228.22 1351.68 l 25
EndSplineSet
AnchorClass2: "mktop"  "'mkmk' Mark to Mark lookup 2-1" "horn"  "'mark' Mark Positioning in Latin lookup 0-1" "bottom"  "'mark' Mark Positioning in Latin lookup 0-1" "ogonek"  "'mark' Mark Positioning in Latin lookup 0-1" "cedilla"  "'mark' Mark Positioning in Latin lookup 0-1" "top"  "'mark' Mark Positioning in Latin lookup 0-1" 
BeginChars: 65536 1113

StartChar: d
Encoding: 100 100 0
Width: 1089
VWidth: 0
Flags: W
HStem: -20 102<403 666> 0 43G<780 944> 819 102<403 659> 1311 41G<780 944>
VStem: 90 164<258 643> 780 164<0 47 208 666 823 1352>
AnchorPoint: "horn" 885 1085 basechar 0
AnchorPoint: "ogonek" 864 0 basechar 0
AnchorPoint: "cedilla" 512 0 basechar 0
AnchorPoint: "bottom" 514 0 basechar 0
AnchorPoint: "top" 532 1004 basechar 0
LayerCount: 2
Fore
SplineSet
780 823 m 1,0,-1
 780 1352 l 1,1,-1
 944 1352 l 1,2,-1
 944 0 l 1,3,-1
 780 0 l 1,4,-1
 780 47 l 1,5,6
 675 -20 675 -20 504 -20 c 0,7,8
 314 -20 314 -20 200 120 c 0,9,10
 90 256 90 256 90 451 c 0,11,12
 90 580 90 580 139.5 686.5 c 128,-1,13
 189 793 189 793 285 857.5 c 128,-1,14
 381 922 381 922 520.5 922 c 128,-1,15
 660 922 660 922 780 823 c 1,0,-1
780 398 m 0,16,17
 780 476 780 476 768 546 c 128,-1,18
 756 616 756 616 729.5 679.5 c 128,-1,19
 703 743 703 743 653 781 c 128,-1,20
 603 819 603 819 527.5 819 c 128,-1,21
 452 819 452 819 386 762.5 c 128,-1,22
 320 706 320 706 287 623 c 128,-1,23
 254 540 254 540 254 451 c 128,-1,24
 254 362 254 362 287 278.5 c 128,-1,25
 320 195 320 195 386 138.5 c 128,-1,26
 452 82 452 82 535 82 c 0,27,28
 628 82 628 82 701 157 c 0,29,30
 780 238 780 238 780 398 c 0,16,17
EndSplineSet
Validated: 1
EndChar

StartChar: a
Encoding: 97 97 1
Width: 974
VWidth: 0
Flags: W
HStem: -20 102<356 691> 0 43G<694 858> 520 102<343 688> 819 102<304 636>
VStem: 94 164<178 440> 694 164<0 16 107 507 606 754>
AnchorPoint: "horn" 811 717 basechar 0
AnchorPoint: "cedilla" 483 0 basechar 0
AnchorPoint: "bottom" 473 0 basechar 0
AnchorPoint: "ogonek" 846 0 basechar 0
AnchorPoint: "top" 489 1004 basechar 0
LayerCount: 2
Fore
SplineSet
115 829 m 1,0,1
 293 922 293 922 438 922 c 0,2,3
 626 922 626 922 708 881 c 0,4,5
 756 857 756 857 784 822.5 c 128,-1,6
 812 788 812 788 830 727 c 0,7,8
 858 628 858 628 858 414 c 2,9,-1
 858 0 l 1,10,-1
 694 0 l 1,11,-1
 694 16 l 1,12,13
 581 -20 581 -20 471 -20 c 0,14,15
 297 -20 297 -20 195.5 58.5 c 128,-1,16
 94 137 94 137 94 311 c 0,17,18
 94 508 94 508 268 584 c 0,19,20
 357 624 357 624 463 624 c 0,21,-1
 466 624 l 0,22,23
 574 624 574 624 690 606 c 1,24,25
 684 726 684 726 638.5 772.5 c 128,-1,26
 593 819 593 819 473.5 819 c 128,-1,27
 354 819 354 819 217 723 c 1,28,-1
 115 829 l 1,0,1
694 125 m 1,29,-1
 694 498 l 1,30,31
 601 520 601 520 501 520 c 128,-1,32
 401 520 401 520 329.5 466 c 128,-1,33
 258 412 258 412 258 310 c 128,-1,34
 258 208 258 208 331 145 c 128,-1,35
 404 82 404 82 504 82 c 128,-1,36
 604 82 604 82 694 125 c 1,29,-1
EndSplineSet
Validated: 1
EndChar

StartChar: h
Encoding: 104 104 2
Width: 1087
VWidth: 0
Flags: W
HStem: 0 43G<147 311 784 948> 819 102<385 697> 1311 41G<147 311>
VStem: 147 164<0 756 870 1352> 784 164<0 717>
AnchorPoint: "horn" 856 717 basechar 0
AnchorPoint: "ogonek" 860 0 basechar 0
AnchorPoint: "cedilla" 532 0 basechar 0
AnchorPoint: "bottom" 532 0 basechar 0
AnchorPoint: "top" 387 1434 basechar 0
LayerCount: 2
Fore
SplineSet
311 723 m 1,0,-1
 311 0 l 1,1,-1
 147 0 l 1,2,-1
 147 1352 l 1,3,-1
 311 1352 l 1,4,-1
 311 870 l 1,5,6
 410 922 410 922 520 922 c 0,7,8
 736 922 736 922 842 816 c 128,-1,9
 948 710 948 710 948 492 c 2,10,-1
 948 0 l 1,11,-1
 784 0 l 1,12,-1
 784 467 l 2,13,14
 784 677 784 677 720 751 c 0,15,16
 662 819 662 819 542 819 c 128,-1,17
 422 819 422 819 311 723 c 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: e
Encoding: 101 101 3
Width: 1028
VWidth: 0
Flags: W
HStem: -20 102<418 733> 451 102<264 770> 819 102<404 661>
VStem: 90 164<256 451>
AnchorPoint: "horn" 840 717 basechar 0
AnchorPoint: "cedilla" 569 0 basechar 0
AnchorPoint: "bottom" 539 0 basechar 0
AnchorPoint: "ogonek" 588 0 basechar 0
AnchorPoint: "top" 530 1004 basechar 0
LayerCount: 2
Fore
SplineSet
932 158 m 1,0,1
 791 -20 791 -20 553 -20 c 0,2,3
 351 -20 351 -20 220.5 109.5 c 128,-1,4
 90 239 90 239 90 451 c 0,5,6
 90 555 90 555 127 645 c 0,7,8
 164 734 164 734 224 794 c 0,9,10
 353 922 353 922 512 922 c 0,11,12
 615 922 615 922 699 880 c 0,13,14
 782 838 782 838 834 770 c 0,15,16
 942 627 942 627 942 451 c 1,17,-1
 254 451 l 1,18,19
 254 283 254 283 345.5 182.5 c 128,-1,20
 437 82 437 82 585 82 c 128,-1,21
 733 82 733 82 809 205 c 1,22,-1
 932 158 l 1,0,1
264 553 m 1,23,-1
 770 553 l 1,24,25
 752 673 752 673 694 746 c 128,-1,26
 636 819 636 819 540 819 c 128,-1,27
 444 819 444 819 367 747 c 128,-1,28
 290 675 290 675 264 553 c 1,23,-1
EndSplineSet
Validated: 1
EndChar

StartChar: n
Encoding: 110 110 4
Width: 1087
VWidth: 0
Flags: W
HStem: 0 43G<147 311 784 948> 819 102<385 697> 860 41G<147 311>
VStem: 147 164<0 756 870 901> 784 164<0 717>
AnchorPoint: "horn" 856 717 basechar 0
AnchorPoint: "ogonek" 877 0 basechar 0
AnchorPoint: "bottom" 541 0 basechar 0
AnchorPoint: "cedilla" 541 0 basechar 0
AnchorPoint: "top" 549 1004 basechar 0
LayerCount: 2
Fore
SplineSet
311 723 m 1,0,-1
 311 0 l 1,1,-1
 147 0 l 1,2,-1
 147 901 l 1,3,-1
 311 901 l 1,4,-1
 311 870 l 1,5,6
 410 922 410 922 520 922 c 0,7,8
 736 922 736 922 842 816 c 128,-1,9
 948 710 948 710 948 492 c 2,10,-1
 948 0 l 1,11,-1
 784 0 l 1,12,-1
 784 467 l 2,13,14
 784 677 784 677 720 751 c 0,15,16
 662 819 662 819 542 819 c 128,-1,17
 422 819 422 819 311 723 c 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: c
Encoding: 99 99 5
Width: 1017
VWidth: 0
Flags: W
HStem: -20 102<418 733> 819 102<404 664>
VStem: 90 164<253 648>
AnchorPoint: "horn" 840 717 basechar 0
AnchorPoint: "ogonek" 571 0 basechar 0
AnchorPoint: "bottom" 569 0 basechar 0
AnchorPoint: "cedilla" 569 0 basechar 0
AnchorPoint: "top" 532 1004 basechar 0
LayerCount: 2
Fore
SplineSet
932 158 m 1,0,1
 791 -20 791 -20 553 -20 c 0,2,3
 351 -20 351 -20 220.5 109.5 c 128,-1,4
 90 239 90 239 90 451 c 0,5,6
 90 555 90 555 127 645 c 0,7,8
 164 734 164 734 224 794 c 0,9,10
 353 922 353 922 499.5 922 c 128,-1,11
 646 922 646 922 743 854.5 c 128,-1,12
 840 787 840 787 893 676 c 1,13,-1
 760 608 l 1,14,15
 734 705 734 705 679 762 c 128,-1,16
 624 819 624 819 543 819 c 0,17,18
 423 819 423 819 338.5 717 c 128,-1,19
 254 615 254 615 254 449 c 128,-1,20
 254 283 254 283 345.5 182.5 c 128,-1,21
 437 82 437 82 585 82 c 128,-1,22
 733 82 733 82 809 205 c 1,23,-1
 932 158 l 1,0,1
EndSplineSet
Validated: 1
EndChar

StartChar: b
Encoding: 98 98 6
Width: 1079
VWidth: 0
Flags: W
HStem: -20 102<387 701> 819 102<430 702> 1311 41G<139 303>
VStem: 139 164<166 678 852 1352> 829 164<237 664>
AnchorPoint: "ogonek" 545 0 basechar 0
AnchorPoint: "horn" 901 717 basechar 0
AnchorPoint: "cedilla" 545 0 basechar 0
AnchorPoint: "bottom" 551 0 basechar 0
AnchorPoint: "top" 578 1004 basechar 0
LayerCount: 2
Fore
SplineSet
303 852 m 1,0,1
 409 922 409 922 538.5 922 c 128,-1,2
 668 922 668 922 756 885 c 128,-1,3
 844 848 844 848 894.5 782 c 128,-1,4
 945 716 945 716 969 633.5 c 128,-1,5
 993 551 993 551 993 451 c 128,-1,6
 993 351 993 351 968.5 268.5 c 128,-1,7
 944 186 944 186 893 120 c 0,8,9
 785 -20 785 -20 549 -20 c 1,10,11
 320 -20 320 -20 224 86 c 0,12,13
 140 180 140 180 139 369 c 2,14,-1
 139 1352 l 1,15,-1
 303 1352 l 1,16,-1
 303 852 l 1,0,1
303 471 m 2,17,-1
 303 303 l 2,18,19
 304 114 304 114 498 87 c 0,20,21
 534 82 534 82 588.5 82 c 128,-1,22
 643 82 643 82 692 115 c 128,-1,23
 741 148 741 148 770 202 c 128,-1,24
 799 256 799 256 814 319.5 c 128,-1,25
 829 383 829 383 829 451 c 128,-1,26
 829 519 829 519 814 582.5 c 128,-1,27
 799 646 799 646 770 700 c 0,28,29
 706 819 706 819 580 819 c 0,30,31
 489 818 489 818 425 770 c 0,32,33
 303 678 303 678 303 471 c 2,17,-1
EndSplineSet
Validated: 1
EndChar

StartChar: s
Encoding: 115 115 7
Width: 897
VWidth: 0
Flags: W
HStem: -20 102<276 603> 819 102<316 571>
VStem: 125 164<595 792> 651 164<128 358>
AnchorPoint: "horn" 647 793 basechar 0
AnchorPoint: "ogonek" 455 0 basechar 0
AnchorPoint: "bottom" 449 0 basechar 0
AnchorPoint: "cedilla" 449 0 basechar 0
AnchorPoint: "top" 416 1004 basechar 0
LayerCount: 2
Fore
SplineSet
756 795 m 1,0,-1
 637 723 l 1,1,2
 555 795 555 795 536.5 800 c 128,-1,3
 518 805 518 805 500 811 c 0,4,5
 477 819 477 819 418 819 c 128,-1,6
 359 819 359 819 324 785 c 128,-1,7
 289 751 289 751 289 688 c 0,8,9
 289 576 289 576 453 547 c 1,10,11
 815 480 815 480 815 262 c 0,12,13
 815 121 815 121 710 50.5 c 128,-1,14
 605 -20 605 -20 434 -20 c 0,15,16
 320 -20 320 -20 260 10 c 128,-1,17
 200 40 200 40 174.5 57 c 128,-1,18
 149 74 149 74 88 117 c 1,19,-1
 176 193 l 1,20,21
 267 129 267 129 315.5 105.5 c 128,-1,22
 364 82 364 82 464 82 c 128,-1,23
 564 82 564 82 607.5 128 c 128,-1,24
 651 174 651 174 651 262 c 0,25,26
 651 388 651 388 434 424 c 1,27,28
 284 452 284 452 204.5 520.5 c 128,-1,29
 125 589 125 589 125 684 c 128,-1,30
 125 779 125 779 197 850.5 c 128,-1,31
 269 922 269 922 383 922 c 128,-1,32
 497 922 497 922 580.5 891.5 c 128,-1,33
 664 861 664 861 756 795 c 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: i
Encoding: 105 105 8
Width: 407
VWidth: 0
Flags: W
HStem: 0 43G<123 287> 860 41G<123 287> 1085 164<123 287>
VStem: 123 164<0 901 1085 1249>
AnchorPoint: "top" 205 1167 basechar 0
AnchorPoint: "horn" 250 717 basechar 0
AnchorPoint: "cedilla" 209 0 basechar 0
AnchorPoint: "bottom" 203 0 basechar 0
AnchorPoint: "ogonek" 279 0 basechar 0
LayerCount: 2
Fore
SplineSet
123 1249 m 1,0,-1
 287 1249 l 1,1,-1
 287 1085 l 1,2,-1
 123 1085 l 1,3,-1
 123 1249 l 1,0,-1
123 901 m 1,4,-1
 287 901 l 1,5,-1
 287 0 l 1,6,-1
 123 0 l 1,7,-1
 123 901 l 1,4,-1
EndSplineSet
Validated: 1
EndChar

StartChar: o
Encoding: 111 111 9
Width: 1056
VWidth: 0
Flags: W
HStem: -20 102<384 673> 819 102<404 673>
VStem: 90 164<231 648> 807 164<241 660>
AnchorPoint: "cedilla" 506 0 basechar 0
AnchorPoint: "horn" 881 635 basechar 0
AnchorPoint: "bottom" 516 0 basechar 0
AnchorPoint: "ogonek" 537 0 basechar 0
AnchorPoint: "top" 535 1004 basechar 0
LayerCount: 2
Fore
SplineSet
807 451 m 128,-1,1
 807 613 807 613 733 716 c 128,-1,2
 659 819 659 819 541 819 c 128,-1,3
 423 819 423 819 338.5 717 c 128,-1,4
 254 615 254 615 254 446.5 c 128,-1,5
 254 278 254 278 327 180 c 128,-1,6
 400 82 400 82 529.5 82 c 128,-1,7
 659 82 659 82 733 185.5 c 128,-1,0
 807 289 807 289 807 451 c 128,-1,1
971 451 m 128,-1,9
 971 222 971 222 845 101 c 128,-1,10
 719 -20 719 -20 516.5 -20 c 128,-1,11
 314 -20 314 -20 202 107 c 128,-1,12
 90 234 90 234 90 451 c 0,13,14
 90 555 90 555 127 645 c 0,15,16
 164 734 164 734 224 794 c 0,17,18
 353 922 353 922 512 922 c 0,19,20
 719 922 719 922 845 801 c 128,-1,8
 971 680 971 680 971 451 c 128,-1,9
EndSplineSet
Validated: 1
EndChar

StartChar: t
Encoding: 116 116 10
Width: 567
VWidth: 0
Flags: W
HStem: 0 43G<188 352> 799 102<84 188 352 514>
VStem: 188 164<0 799 901 1198>
AnchorPoint: "horn" 319 1085 basechar 0
AnchorPoint: "ogonek" 279 0 basechar 0
AnchorPoint: "bottom" 264 0 basechar 0
AnchorPoint: "cedilla" 264 0 basechar 0
AnchorPoint: "top" 272 1352 basechar 0
LayerCount: 2
Fore
SplineSet
352 799 m 1,0,-1
 352 0 l 1,1,-1
 188 0 l 1,2,-1
 188 799 l 1,3,-1
 53 799 l 1,4,-1
 84 901 l 1,5,-1
 188 901 l 1,6,-1
 188 1198 l 1,7,-1
 352 1229 l 1,8,-1
 352 901 l 1,9,-1
 514 901 l 1,10,-1
 514 799 l 1,11,-1
 352 799 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: m
Encoding: 109 109 11
Width: 1605
VWidth: 0
Flags: W
HStem: 0 43G<147 311 725 889 1303 1466> 819 102<367 664 944 1231> 860 41G<147 311>
VStem: 147 164<0 766 874 901> 725 164<0 753> 1303 164<0 726>
CounterMasks: 1 1c
AnchorPoint: "horn" 1389 717 basechar 0
AnchorPoint: "cedilla" 815 0 basechar 0
AnchorPoint: "ogonek" 1380 0 basechar 0
AnchorPoint: "bottom" 809 0 basechar 0
AnchorPoint: "top" 809 1004 basechar 0
LayerCount: 2
Fore
SplineSet
311 729 m 1,0,-1
 311 0 l 1,1,-1
 147 0 l 1,2,-1
 147 901 l 1,3,-1
 311 901 l 1,4,-1
 311 874 l 1,5,6
 393 922 393 922 489 922 c 0,7,8
 705 922 705 922 799 815 c 1,9,10
 857 860 857 860 934 891 c 128,-1,11
 1011 922 1011 922 1073 922 c 0,12,13
 1264 922 1264 922 1365 814.5 c 128,-1,14
 1466 707 1466 707 1466 492 c 2,15,-1
 1466 0 l 1,16,-1
 1303 0 l 1,17,-1
 1303 500 l 2,18,19
 1303 696 1303 696 1244 762 c 0,20,21
 1194 818 1194 818 1116 819 c 0,22,23
 950 819 950 819 889 719 c 1,24,-1
 889 0 l 1,25,-1
 725 0 l 1,26,-1
 725 500 l 2,27,28
 725 699 725 699 675 762 c 0,29,30
 648 796 648 796 613 807.5 c 128,-1,31
 578 819 578 819 520 819 c 0,32,33
 404 819 404 819 311 729 c 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: f
Encoding: 102 102 12
Width: 559
VWidth: 0
Flags: W
HStem: 0 43G<166 330> 799 102<61 166 330 492> 1270 102<363 538>
VStem: 166 164<0 799 901 1238>
AnchorPoint: "horn" 512 1315 basechar 0
AnchorPoint: "ogonek" 250 0 basechar 0
AnchorPoint: "cedilla" 250 0 basechar 0
AnchorPoint: "bottom" 246 0 basechar 0
AnchorPoint: "top" 340 1434 basechar 0
LayerCount: 2
Fore
SplineSet
524 1239 m 1,0,1
 500 1270 500 1270 444 1270 c 0,2,3
 388 1270 388 1270 359 1221 c 128,-1,4
 330 1172 330 1172 330 1042 c 2,5,-1
 330 901 l 1,6,-1
 492 901 l 1,7,-1
 492 799 l 1,8,-1
 330 799 l 1,9,-1
 330 0 l 1,10,-1
 166 0 l 1,11,-1
 166 799 l 1,12,-1
 31 799 l 1,13,-1
 61 901 l 1,14,-1
 166 901 l 1,15,-1
 166 1096 l 2,16,17
 166 1221 166 1221 233.5 1296.5 c 128,-1,18
 301 1372 301 1372 422 1372 c 0,19,20
 506 1372 506 1372 567 1350 c 1,21,-1
 524 1239 l 1,0,1
EndSplineSet
Validated: 1
EndChar

StartChar: j
Encoding: 106 106 13
Width: 536
VWidth: 0
Flags: W
HStem: -348 102<-3 219> 860 41G<252 416> 1085 164<252 416>
VStem: 252 164<-216 901 1085 1249>
AnchorPoint: "cedilla" 139 -348 basechar 0
AnchorPoint: "ogonek" 287 -266 basechar 0
AnchorPoint: "horn" 369 717 basechar 0
AnchorPoint: "top" 334 1167 basechar 0
AnchorPoint: "bottom" 129 -348 basechar 0
LayerCount: 2
Fore
SplineSet
33 -195 m 5,0,1
 69 -246 69 -246 135 -246 c 128,-1,2
 201 -246 201 -246 226.5 -187.5 c 128,-1,3
 252 -129 252 -129 252 0 c 2,4,-1
 252 901 l 1,5,-1
 416 901 l 1,6,-1
 416 -68 l 2,7,8
 416 -272 416 -272 220 -332 c 0,9,10
 168 -348 168 -348 111 -348 c 0,11,12
 -19 -348 -19 -348 -96 -256 c 1,13,-1
 33 -195 l 5,0,1
252 1249 m 1,14,-1
 416 1249 l 1,15,-1
 416 1085 l 1,16,-1
 252 1085 l 1,17,-1
 252 1249 l 1,14,-1
EndSplineSet
Validated: 1
EndChar

StartChar: space
Encoding: 32 32 14
Width: 409
VWidth: 0
Flags: W
LayerCount: 2
EndChar

StartChar: l
Encoding: 108 108 15
Width: 456
VWidth: 0
Flags: W
HStem: 0 43G<147 311> 1311 41G<147 311>
VStem: 147 164<0 1352>
AnchorPoint: "horn" 266 1085 basechar 0
AnchorPoint: "ogonek" 233 0 basechar 0
AnchorPoint: "bottom" 227 0 basechar 0
AnchorPoint: "cedilla" 223 0 basechar 0
AnchorPoint: "top" 229 1434 basechar 0
LayerCount: 2
Fore
SplineSet
311 1352 m 25,0,-1
 311 0 l 1,1,-1
 147 0 l 1,2,-1
 147 1352 l 1,3,-1
 311 1352 l 25,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: p
Encoding: 112 112 16
Width: 1087
VWidth: 0
Flags: W
HStem: -16 102<439 692> 823 102<421 705> 864 41G<147 311>
VStem: 147 164<-410 59 240 710 866 905> 838 164<262 660>
AnchorPoint: "horn" 885 717 basechar 0
AnchorPoint: "ogonek" 561 0 basechar 0
AnchorPoint: "cedilla" 561 0 basechar 0
AnchorPoint: "bottom" 598 0 basechar 0
AnchorPoint: "top" 582 1004 basechar 0
LayerCount: 2
Fore
SplineSet
311 59 m 1,0,-1
 311 -410 l 1,1,-1
 147 -410 l 1,2,-1
 147 905 l 1,3,-1
 311 905 l 1,4,-1
 311 866 l 1,5,6
 406 926 406 926 549 926 c 128,-1,7
 692 926 692 926 792 861.5 c 128,-1,8
 892 797 892 797 946.5 690 c 128,-1,9
 1001 583 1001 583 1001 455 c 0,10,11
 1001 262 1001 262 868.5 123 c 128,-1,12
 736 -16 736 -16 547 -16 c 0,13,14
 408 -16 408 -16 311 59 c 1,0,-1
311 508 m 2,15,-1
 311 504 l 2,16,17
 311 196 311 196 467 112 c 0,18,19
 515 86 515 86 581 86 c 128,-1,20
 647 86 647 86 708 142 c 128,-1,21
 769 198 769 198 803.5 283 c 128,-1,22
 838 368 838 368 838 455.5 c 128,-1,23
 838 543 838 543 808.5 627 c 128,-1,24
 779 711 779 711 722.5 767 c 128,-1,25
 666 823 666 823 598 823 c 0,26,27
 443 823 443 823 377 742.5 c 128,-1,28
 311 662 311 662 311 508 c 2,15,-1
EndSplineSet
Validated: 1
EndChar

StartChar: q
Encoding: 113 113 17
Width: 1089
VWidth: 0
Flags: W
HStem: -20 102<382 654> 819 102<382 696>
VStem: 90 164<237 664> 780 164<-410 49 223 735>
AnchorPoint: "horn" 877 717 basechar 0
AnchorPoint: "ogonek" 487 0 basechar 0
AnchorPoint: "cedilla" 487 0 basechar 0
AnchorPoint: "bottom" 487 0 basechar 0
AnchorPoint: "top" 522 1004 basechar 0
LayerCount: 2
Fore
SplineSet
780 49 m 1,0,1
 676 -20 676 -20 546 -20 c 128,-1,2
 416 -20 416 -20 328 17 c 128,-1,3
 240 54 240 54 189 120 c 128,-1,4
 138 186 138 186 114 268.5 c 128,-1,5
 90 351 90 351 90 451 c 0,6,7
 90 552 90 552 114 634 c 128,-1,8
 138 716 138 716 190 782 c 0,9,10
 299 922 299 922 535 922 c 0,11,12
 764 922 764 922 860 814 c 0,13,14
 944 720 944 720 944 532 c 2,15,-1
 944 -410 l 1,16,-1
 780 -410 l 1,17,-1
 780 49 l 1,0,1
780 430 m 2,18,-1
 780 598 l 2,19,20
 780 734 780 734 693 780 c 0,21,22
 620 820 620 820 523 820 c 0,23,-1
 520 820 l 0,24,25
 422 820 422 820 363 762 c 0,26,27
 254 657 254 657 254 451 c 0,28,29
 254 311 254 311 314 202 c 0,30,31
 380 82 380 82 509.5 82 c 129,-1,32
 639 82 639 82 709.5 180.5 c 128,-1,33
 780 279 780 279 780 430 c 2,18,-1
EndSplineSet
Validated: 1
EndChar

StartChar: r
Encoding: 114 114 18
Width: 677
VWidth: 0
Flags: W
HStem: 0 43G<147 311> 819 102<356 647> 860 41G<147 311>
VStem: 147 164<0 774 874 901>
AnchorPoint: "horn" 647 856 basechar 0
AnchorPoint: "ogonek" 246 0 basechar 0
AnchorPoint: "bottom" 240 0 basechar 0
AnchorPoint: "cedilla" 225 0 basechar 0
AnchorPoint: "top" 397 1004 basechar 0
LayerCount: 2
Fore
SplineSet
672 741 m 1,0,1
 631 819 631 819 511 819 c 128,-1,2
 391 819 391 819 311 735 c 1,3,-1
 311 0 l 1,4,-1
 147 0 l 1,5,-1
 147 901 l 1,6,-1
 311 901 l 1,7,-1
 311 874 l 1,8,9
 390 922 390 922 490 922 c 128,-1,10
 590 922 590 922 672 893 c 1,11,-1
 672 741 l 1,0,1
EndSplineSet
Validated: 1
EndChar

StartChar: u
Encoding: 117 117 19
Width: 1067
VWidth: 0
Flags: W
HStem: -20 102<417 723> 0 43G<780 944> 860 41G<143 307 780 944>
VStem: 143 164<204 901> 780 164<0 33 135 901>
AnchorPoint: "cedilla" 522 0 basechar 0
AnchorPoint: "horn" 944 635 basechar 0
AnchorPoint: "bottom" 532 0 basechar 0
AnchorPoint: "ogonek" 936 0 basechar 0
AnchorPoint: "top" 549 1004 basechar 0
LayerCount: 2
Fore
SplineSet
780 172 m 1,0,-1
 780 901 l 1,1,-1
 944 901 l 1,2,-1
 944 0 l 1,3,-1
 780 0 l 1,4,-1
 780 33 l 1,5,6
 668 -20 668 -20 541 -20 c 0,7,8
 329 -20 329 -20 236 84 c 128,-1,9
 143 188 143 188 143 410 c 2,10,-1
 143 901 l 1,11,-1
 307 901 l 1,12,-1
 307 434 l 2,13,14
 307 227 307 227 386 150 c 0,15,16
 456 82 456 82 571.5 82 c 128,-1,17
 687 82 687 82 780 172 c 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: g
Encoding: 103 103 20
Width: 1038
VWidth: 0
Flags: W
HStem: -348 102<339 671> -20 102<393 705> 819 102<378 633> 860 41G<729 893>
VStem: 90 164<235 670> 729 164<-181 23 114 716 844 901>
AnchorPoint: "horn" 844 717 basechar 0
AnchorPoint: "cedilla" 496 -319 basechar 0
AnchorPoint: "ogonek" 639 -299 basechar 0
AnchorPoint: "bottom" 492 -330 basechar 0
AnchorPoint: "top" 506 1004 basechar 0
LayerCount: 2
Fore
SplineSet
893 901 m 1,0,-1
 893 160 l 2,1,2
 893 -54 893 -54 870 -134 c 128,-1,3
 847 -214 847 -214 819 -248 c 0,4,5
 790 -282 790 -282 742 -307 c 0,6,7
 659 -348 659 -348 492.5 -348 c 128,-1,8
 326 -348 326 -348 150 -256 c 1,9,-1
 252 -150 l 1,10,11
 389 -246 389 -246 504 -246 c 0,12,13
 575 -246 575 -246 617.5 -233 c 128,-1,14
 660 -220 660 -220 684 -186 c 0,15,16
 725 -129 725 -129 729 23 c 1,17,18
 632 -20 632 -20 522 -20 c 0,19,20
 323 -20 323 -20 206.5 107.5 c 128,-1,21
 90 235 90 235 90 447 c 128,-1,22
 90 659 90 659 205.5 790.5 c 128,-1,23
 321 922 321 922 470 922 c 128,-1,24
 619 922 619 922 729 844 c 1,25,-1
 729 901 l 1,26,-1
 893 901 l 1,0,-1
729 145 m 1,27,-1
 729 608 l 1,28,29
 703 705 703 705 648 762 c 128,-1,30
 593 819 593 819 512 819 c 0,31,32
 396 819 396 819 325 719 c 128,-1,33
 254 619 254 619 254 449 c 128,-1,34
 254 279 254 279 331.5 180.5 c 128,-1,35
 409 82 409 82 553 82 c 0,36,37
 660 82 660 82 729 145 c 1,27,-1
EndSplineSet
Validated: 1
EndChar

StartChar: v
Encoding: 118 118 21
Width: 849
VWidth: 0
Flags: W
HStem: 0 43G<331 525> 860 41G<18 183 659 838>
AnchorPoint: "horn" 729 717 basechar 0
AnchorPoint: "ogonek" 418 0 basechar 0
AnchorPoint: "cedilla" 418 0 basechar 0
AnchorPoint: "bottom" 424 0 basechar 0
AnchorPoint: "top" 432 1004 basechar 0
LayerCount: 2
Fore
SplineSet
510 0 m 1,0,-1
 346 0 l 1,1,-1
 18 901 l 1,2,-1
 168 901 l 1,3,-1
 420 205 l 1,4,-1
 674 901 l 1,5,-1
 838 901 l 1,6,-1
 510 0 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: w
Encoding: 119 119 22
Width: 1529
VWidth: 0
Flags: W
HStem: 0 43G<341 519 1013 1190> 860 41G<29 193 669 848 1324 1503>
AnchorPoint: "horn" 1380 717 basechar 0
AnchorPoint: "ogonek" 1110 0 basechar 0
AnchorPoint: "cedilla" 766 0 basechar 0
AnchorPoint: "bottom" 766 0 basechar 0
AnchorPoint: "top" 760 1004 basechar 0
LayerCount: 2
Fore
SplineSet
430 205 m 1,0,-1
 684 901 l 1,1,-1
 834 901 l 1,2,-1
 1085 205 l 1,3,-1
 1339 901 l 1,4,-1
 1503 901 l 1,5,-1
 1176 0 l 1,6,-1
 1028 0 l 1,7,-1
 766 719 l 1,8,-1
 504 0 l 1,9,-1
 356 0 l 1,10,-1
 29 901 l 1,11,-1
 178 901 l 1,12,-1
 430 205 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: x
Encoding: 120 120 23
Width: 833
VWidth: 0
Flags: W
HStem: 0 43G<8 213 625 829> 860 41G<66 268 569 772>
AnchorPoint: "horn" 614 717 basechar 0
AnchorPoint: "ogonek" 750 0 basechar 0
AnchorPoint: "cedilla" 418 0 basechar 0
AnchorPoint: "bottom" 416 0 basechar 0
AnchorPoint: "top" 422 1004 basechar 0
LayerCount: 2
Fore
SplineSet
330 494 m 1,0,-1
 66 901 l 1,1,-1
 242 901 l 1,2,-1
 418 629 l 1,3,-1
 596 901 l 1,4,-1
 772 901 l 1,5,-1
 508 494 l 1,6,-1
 829 0 l 1,7,-1
 651 0 l 1,8,-1
 418 358 l 1,9,-1
 186 0 l 1,10,-1
 8 0 l 1,11,-1
 330 494 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: y
Encoding: 121 121 24
Width: 880
VWidth: 0
Flags: W
HStem: -348 102<164 291> 860 41G<45 209 685 864>
AnchorPoint: "horn" 762 717 basechar 0
AnchorPoint: "cedilla" 242 -328 basechar 0
AnchorPoint: "bottom" 365 -315 basechar 0
AnchorPoint: "ogonek" 614 0 basechar 0
AnchorPoint: "top" 461 1004 basechar 0
LayerCount: 2
Fore
SplineSet
201 -348 m 0,0,1
 146 -348 146 -348 100 -315 c 128,-1,2
 54 -282 54 -282 -10 -213 c 1,3,-1
 121 -147 l 1,4,5
 168 -211 168 -211 189.5 -228.5 c 128,-1,6
 211 -246 211 -246 231 -246 c 0,7,8
 271 -246 271 -246 304 -179 c 0,9,10
 318 -151 318 -151 356 -45 c 1,11,-1
 373 0 l 1,12,-1
 45 901 l 1,13,-1
 195 901 l 1,14,-1
 446 205 l 1,15,-1
 700 901 l 1,16,-1
 864 901 l 1,17,-1
 518 -49 l 2,18,19
 464 -197 464 -197 389 -272.5 c 128,-1,20
 314 -348 314 -348 201 -348 c 0,0,1
EndSplineSet
Validated: 1
EndChar

StartChar: k
Encoding: 107 107 25
Width: 980
VWidth: 0
Flags: W
HStem: 0 43G<147 311 705 913> 860 41G<652 877> 1311 41G<147 311>
VStem: 147 164<0 268 477 1352>
AnchorPoint: "horn" 668 717 basechar 0
AnchorPoint: "ogonek" 819 0 basechar 0
AnchorPoint: "bottom" 508 0 basechar 0
AnchorPoint: "cedilla" 508 0 basechar 0
AnchorPoint: "top" 387 1434 basechar 0
LayerCount: 2
Fore
SplineSet
311 268 m 1,0,-1
 311 0 l 1,1,-1
 147 0 l 1,2,-1
 147 1352 l 1,3,-1
 311 1352 l 1,4,-1
 311 477 l 1,5,-1
 688 901 l 1,6,-1
 877 901 l 1,7,-1
 520 502 l 1,8,-1
 913 0 l 1,9,-1
 737 0 l 1,10,-1
 424 395 l 1,11,-1
 311 268 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: z
Encoding: 122 122 26
Width: 860
VWidth: 0
Flags: W
HStem: 0 102<299 823> 799 102<74 573>
AnchorPoint: "horn" 651 717 basechar 0
AnchorPoint: "ogonek" 717 0 basechar 0
AnchorPoint: "cedilla" 442 0 basechar 0
AnchorPoint: "bottom" 442 0 basechar 0
AnchorPoint: "top" 438 1004 basechar 0
LayerCount: 2
Fore
SplineSet
573 799 m 1,0,-1
 43 799 l 1,1,-1
 74 901 l 1,2,-1
 817 901 l 1,3,-1
 299 102 l 1,4,-1
 823 102 l 1,5,-1
 823 0 l 1,6,-1
 53 0 l 1,7,-1
 573 799 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: A
Encoding: 65 65 27
Width: 1298
VWidth: 0
Flags: W
HStem: 0 43G<39 218 1085 1264> 410 102<389 913> 1393 41G<546 756>
AnchorPoint: "horn" 819 1085 basechar 0
AnchorPoint: "cedilla" 631 0 basechar 0
AnchorPoint: "bottom" 653 0 basechar 0
AnchorPoint: "ogonek" 1100 0 basechar 0
AnchorPoint: "top" 651 1434 basechar 0
LayerCount: 2
Fore
SplineSet
39 0 m 5,0,-1
 561 1434 l 5,1,-1
 741 1434 l 1,2,-1
 1264 0 l 1,3,-1
 1100 0 l 1,4,-1
 950 410 l 1,5,-1
 352 410 l 5,6,-1
 203 0 l 5,7,-1
 39 0 l 5,0,-1
651 1231 m 5,8,-1
 389 512 l 5,9,-1
 913 512 l 1,10,-1
 651 1231 l 5,8,-1
EndSplineSet
Validated: 1
EndChar

StartChar: B
Encoding: 66 66 28
Width: 1116
VWidth: 0
Flags: W
HStem: 0 102<348 758> 727 102<348 668> 1331 102<348 691>
VStem: 174 174<102 727 829 1331> 778 174<946 1243> 864 174<216 579>
AnchorPoint: "horn" 893 1085 basechar 0
AnchorPoint: "ogonek" 524 0 basechar 0
AnchorPoint: "cedilla" 524 0 basechar 0
AnchorPoint: "bottom" 563 0 basechar 0
AnchorPoint: "top" 502 1434 basechar 0
LayerCount: 2
Fore
SplineSet
348 727 m 1,0,-1
 348 102 l 1,1,-1
 614 102 l 2,2,3
 736 102 736 102 800 185.5 c 128,-1,4
 864 269 864 269 864 366.5 c 128,-1,5
 864 464 864 464 839 539 c 128,-1,6
 814 614 814 614 755 670.5 c 128,-1,7
 696 727 696 727 614 727 c 2,8,-1
 348 727 l 1,0,-1
780 795 m 1,9,10
 908 743 908 743 973 629.5 c 128,-1,11
 1038 516 1038 516 1038 387 c 0,12,13
 1038 226 1038 226 933 117 c 0,14,15
 820 0 820 0 584 0 c 2,16,-1
 174 0 l 1,17,-1
 174 1434 l 1,18,-1
 543 1434 l 2,19,20
 812 1434 812 1434 902 1283 c 0,21,22
 952 1199 952 1199 952 1075 c 0,23,24
 952 1010 952 1010 910.5 929.5 c 128,-1,25
 869 849 869 849 780 795 c 1,9,10
348 1331 m 1,26,-1
 348 829 l 1,27,-1
 528 829 l 2,28,29
 590 829 590 829 640 856 c 0,30,31
 690 882 690 882 719 922 c 0,32,33
 778 1002 778 1002 778 1075 c 0,34,35
 778 1189 778 1189 720 1264 c 0,36,37
 669 1331 669 1331 573 1331 c 2,38,-1
 348 1331 l 1,26,-1
EndSplineSet
Validated: 1
EndChar

StartChar: P
Encoding: 80 80 29
Width: 1089
VWidth: 0
Flags: W
HStem: 0 43G<174 348> 655 102<348 755> 1331 102<348 757>
VStem: 174 174<0 655 758 1331> 864 174<872 1217>
AnchorPoint: "horn" 987 1085 basechar 0
AnchorPoint: "ogonek" 254 0 basechar 0
AnchorPoint: "cedilla" 254 0 basechar 0
AnchorPoint: "bottom" 451 0 basechar 0
AnchorPoint: "top" 561 1434 basechar 0
LayerCount: 2
Fore
SplineSet
348 655 m 1,0,-1
 348 0 l 1,1,-1
 174 0 l 1,2,-1
 174 1434 l 1,3,-1
 594 1434 l 2,4,5
 857 1434 857 1434 976 1252 c 0,6,7
 1038 1157 1038 1157 1038 1044 c 0,8,9
 1038 932 1038 932 974 836 c 0,10,11
 854 655 854 655 594 655 c 2,12,-1
 348 655 l 1,0,-1
348 1331 m 1,13,-1
 348 758 l 1,14,-1
 625 758 l 2,15,16
 749 758 749 758 810 856 c 0,17,18
 864 943 864 943 864 1044 c 0,19,20
 864 1145 864 1145 810 1233 c 0,21,22
 750 1331 750 1331 625 1331 c 2,23,-1
 348 1331 l 1,13,-1
EndSplineSet
Validated: 1
EndChar

StartChar: C
Encoding: 67 67 30
Width: 1331
VWidth: 0
Flags: W
HStem: -20 102<600 974> 1352 102<556 933>
VStem: 102 174<451 1012>
AnchorPoint: "horn" 1143 1282 basechar 0
AnchorPoint: "ogonek" 741 0 basechar 0
AnchorPoint: "bottom" 758 0 basechar 0
AnchorPoint: "cedilla" 758 0 basechar 0
AnchorPoint: "top" 717 1434 basechar 0
LayerCount: 2
Fore
SplineSet
1249 209 m 1,0,1
 1169 106 1169 106 1035.5 43 c 128,-1,2
 902 -20 902 -20 741 -20 c 0,3,4
 564 -20 564 -20 401 93 c 0,5,6
 216 222 216 222 143 444 c 0,7,8
 102 570 102 570 102 717.5 c 128,-1,9
 102 865 102 865 139 989.5 c 128,-1,10
 176 1114 176 1114 236 1198 c 128,-1,11
 296 1282 296 1282 375 1341 c 0,12,13
 526 1454 526 1454 702 1454 c 0,14,15
 1075 1454 1075 1454 1243 1245 c 1,16,-1
 1090 1178 l 1,17,18
 1035 1256 1035 1256 945 1304 c 128,-1,19
 855 1352 855 1352 748.5 1352 c 128,-1,20
 642 1352 642 1352 561 1312.5 c 128,-1,21
 480 1273 480 1273 415.5 1197 c 128,-1,22
 351 1121 351 1121 313.5 997 c 128,-1,23
 276 873 276 873 276 730 c 128,-1,24
 276 587 276 587 309 478 c 0,25,26
 342 370 342 370 394 298 c 0,27,28
 448 226 448 226 514 176 c 0,29,30
 684 90 684 90 772 82 c 1,31,32
 1010 82 1010 82 1128 264 c 1,33,-1
 1249 209 l 1,0,1
EndSplineSet
Validated: 1
EndChar

StartChar: D
Encoding: 68 68 31
Width: 1304
VWidth: 0
Flags: W
HStem: 0 102<348 826> 1331 102<348 841>
VStem: 174 174<102 1331> 1030 174<394 1073>
AnchorPoint: "cedilla" 549 0 basechar 0
AnchorPoint: "ogonek" 549 0 basechar 0
AnchorPoint: "horn" 1102 1085 basechar 0
AnchorPoint: "bottom" 594 0 basechar 0
AnchorPoint: "top" 582 1434 basechar 0
LayerCount: 2
Fore
SplineSet
670 0 m 2,0,-1
 174 0 l 1,1,-1
 174 1434 l 1,2,-1
 670 1434 l 2,3,4
 1204 1434 1204 1434 1204 737 c 0,5,6
 1204 376 1204 376 1061.5 188 c 128,-1,7
 919 0 919 0 670 0 c 2,0,-1
348 1331 m 1,8,-1
 348 102 l 1,9,-1
 700 102 l 2,10,11
 837 102 837 102 930 249 c 0,12,13
 1030 406 1030 406 1030 737 c 0,14,15
 1030 1112 1030 1112 891 1252 c 0,16,17
 813 1331 813 1331 703 1331 c 0,18,-1
 700 1331 l 2,19,-1
 348 1331 l 1,8,-1
EndSplineSet
Validated: 1
EndChar

StartChar: E
Encoding: 69 69 32
Width: 1118
VWidth: 0
Flags: W
HStem: 0 102<348 1034> 799 102<348 817> 1331 102<348 1001>
VStem: 174 174<102 799 901 1331>
AnchorPoint: "horn" 942 1384 basechar 0
AnchorPoint: "cedilla" 641 0 basechar 0
AnchorPoint: "bottom" 629 0 basechar 0
AnchorPoint: "ogonek" 846 0 basechar 0
AnchorPoint: "top" 614 1434 basechar 0
LayerCount: 2
Fore
SplineSet
1034 0 m 1,0,-1
 174 0 l 1,1,-1
 174 1434 l 1,2,-1
 1001 1434 l 1,3,-1
 1001 1331 l 1,4,-1
 348 1331 l 1,5,-1
 348 901 l 1,6,-1
 817 901 l 1,7,-1
 817 799 l 1,8,-1
 348 799 l 1,9,-1
 348 102 l 1,10,-1
 1034 102 l 1,11,-1
 1034 0 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: F
Encoding: 70 70 33
Width: 1067
VWidth: 0
Flags: W
HStem: 0 43G<174 348> 799 102<348 817> 1331 102<348 1001>
VStem: 174 174<0 799 901 1331>
AnchorPoint: "horn" 954 1384 basechar 0
AnchorPoint: "ogonek" 258 0 basechar 0
AnchorPoint: "cedilla" 258 0 basechar 0
AnchorPoint: "bottom" 410 0 basechar 0
AnchorPoint: "top" 604 1434 basechar 0
LayerCount: 2
Fore
SplineSet
174 0 m 1,0,-1
 174 1434 l 1,1,-1
 1001 1434 l 1,2,-1
 1001 1331 l 1,3,-1
 348 1331 l 1,4,-1
 348 901 l 1,5,-1
 817 901 l 1,6,-1
 817 799 l 1,7,-1
 348 799 l 1,8,-1
 348 0 l 1,9,-1
 174 0 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: G
Encoding: 71 71 34
Width: 1372
VWidth: 0
Flags: W
HStem: -20 102<600 973> 717 102<913 1085> 1331 102<549 954>
VStem: 102 174<451 1008> 1085 164<173 717>
AnchorPoint: "horn" 1143 1282 basechar 0
AnchorPoint: "ogonek" 737 0 basechar 0
AnchorPoint: "bottom" 758 0 basechar 0
AnchorPoint: "cedilla" 758 0 basechar 0
AnchorPoint: "top" 717 1434 basechar 0
LayerCount: 2
Fore
SplineSet
913 819 m 1,0,-1
 1249 819 l 1,1,-1
 1249 209 l 1,2,3
 1169 106 1169 106 1035.5 43 c 128,-1,4
 902 -20 902 -20 741 -20 c 0,5,6
 564 -20 564 -20 401 93 c 0,7,8
 216 222 216 222 143 444 c 0,9,10
 102 570 102 570 102 717 c 128,-1,11
 102 864 102 864 139 986 c 128,-1,12
 176 1108 176 1108 236 1190 c 128,-1,13
 296 1272 296 1272 375 1328 c 0,14,15
 524 1434 524 1434 702 1434 c 0,16,17
 1091 1434 1091 1434 1243 1245 c 1,18,-1
 1090 1178 l 1,19,20
 982 1331 982 1331 733 1331 c 0,21,22
 546 1331 546 1331 416 1186 c 0,23,24
 276 1030 276 1030 276 717 c 0,25,26
 276 587 276 587 309 478 c 0,27,28
 342 370 342 370 394 298 c 0,29,30
 448 226 448 226 514 176 c 0,31,32
 684 90 684 90 772 82 c 1,33,34
 967 82 967 82 1085 209 c 1,35,-1
 1085 717 l 1,36,-1
 913 717 l 1,37,-1
 913 819 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: H
Encoding: 72 72 35
Width: 1351
VWidth: 0
Flags: W
HStem: 0 43G<174 348 1008 1182> 717 102<348 1008> 1393 41G<174 348 1008 1182>
VStem: 174 174<0 717 819 1434> 1008 174<0 717 819 1434>
AnchorPoint: "horn" 1147 1352 basechar 0
AnchorPoint: "ogonek" 1102 0 basechar 0
AnchorPoint: "cedilla" 651 0 basechar 0
AnchorPoint: "bottom" 674 0 basechar 0
AnchorPoint: "top" 686 1434 basechar 0
LayerCount: 2
Fore
SplineSet
348 1434 m 1,0,-1
 348 819 l 1,1,-1
 1008 819 l 1,2,-1
 1008 1434 l 1,3,-1
 1182 1434 l 1,4,-1
 1182 0 l 1,5,-1
 1008 0 l 1,6,-1
 1008 717 l 1,7,-1
 348 717 l 1,8,-1
 348 0 l 1,9,-1
 174 0 l 1,10,-1
 174 1434 l 1,11,-1
 348 1434 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: I
Encoding: 73 73 36
Width: 514
VWidth: 0
Flags: W
HStem: 0 43G<172 346> 1393 41G<172 346>
VStem: 172 174<0 1434>
AnchorPoint: "horn" 291 1085 basechar 0
AnchorPoint: "cedilla" 270 0 basechar 0
AnchorPoint: "bottom" 252 0 basechar 0
AnchorPoint: "ogonek" 236 0 basechar 0
AnchorPoint: "top" 262 1434 basechar 0
LayerCount: 2
Fore
SplineSet
346 1434 m 25,0,-1
 346 0 l 1,1,-1
 172 0 l 1,2,-1
 172 1434 l 1,3,-1
 346 1434 l 25,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: J
Encoding: 74 74 37
Width: 954
VWidth: 0
Flags: W
HStem: -20 102<225 556> 1393 41G<614 788>
VStem: 614 174<147 1434>
AnchorPoint: "cedilla" 401 0 basechar 0
AnchorPoint: "ogonek" 401 0 basechar 0
AnchorPoint: "horn" 733 1085 basechar 0
AnchorPoint: "bottom" 383 0 basechar 0
AnchorPoint: "top" 705 1434 basechar 0
LayerCount: 2
Fore
SplineSet
788 487 m 18,0,1
 788 276 788 276 763 195 c 128,-1,2
 738 114 738 114 709 79.5 c 128,-1,3
 680 45 680 45 630 21 c 0,4,5
 545 -20 545 -20 378 -20 c 129,-1,6
 211 -20 211 -20 35 72 c 1,7,-1
 137 178 l 1,8,9
 274 82 274 82 389 82 c 0,10,11
 529 82 529 82 568 140 c 0,12,13
 601 188 601 188 606 242 c 0,14,15
 614 316 614 316 614 442 c 2,16,-1
 614 1434 l 1,17,-1
 788 1434 l 1,18,-1
 788 487 l 18,0,1
EndSplineSet
Validated: 1
EndChar

StartChar: K
Encoding: 75 75 38
Width: 1243
VWidth: 0
Flags: W
HStem: 0 43G<174 348 1008 1233> 1393 41G<174 348 967 1208>
VStem: 174 174<0 469 696 1434>
AnchorPoint: "horn" 1032 1352 basechar 0
AnchorPoint: "ogonek" 1135 0 basechar 0
AnchorPoint: "bottom" 635 0 basechar 0
AnchorPoint: "cedilla" 655 0 basechar 0
AnchorPoint: "top" 483 1434 basechar 0
LayerCount: 2
Fore
SplineSet
348 469 m 1,0,-1
 348 0 l 1,1,-1
 174 0 l 1,2,-1
 174 1434 l 1,3,-1
 348 1434 l 1,4,-1
 348 696 l 1,5,-1
 1004 1434 l 1,6,-1
 1208 1434 l 1,7,-1
 623 776 l 1,8,-1
 1233 0 l 1,9,-1
 1040 0 l 1,10,-1
 520 662 l 1,11,-1
 348 469 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: L
Encoding: 76 76 39
Width: 1083
VWidth: 0
Flags: W
HStem: 0 102<348 1034> 1393 41G<174 348>
VStem: 174 174<102 1434>
AnchorPoint: "horn" 283 1085 basechar 0
AnchorPoint: "ogonek" 745 0 basechar 0
AnchorPoint: "bottom" 604 0 basechar 0
AnchorPoint: "cedilla" 596 0 basechar 0
AnchorPoint: "top" 440 1434 basechar 0
LayerCount: 2
Fore
SplineSet
348 102 m 1,0,-1
 1034 102 l 1,1,-1
 1034 0 l 1,2,-1
 174 0 l 1,3,-1
 174 1434 l 1,4,-1
 348 1434 l 1,5,-1
 348 102 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: M
Encoding: 77 77 40
Width: 1626
VWidth: 0
Flags: W
HStem: 0 43G<174 348 1282 1456> 1393 41G<174 367 1263 1456>
VStem: 174 174<0 1098> 1282 174<0 1098>
AnchorPoint: "horn" 1393 1085 basechar 0
AnchorPoint: "ogonek" 1389 0 basechar 0
AnchorPoint: "cedilla" 840 0 basechar 0
AnchorPoint: "bottom" 815 0 basechar 0
AnchorPoint: "top" 815 1434 basechar 0
LayerCount: 2
Fore
SplineSet
348 1098 m 1,0,-1
 348 0 l 1,1,-1
 174 0 l 1,2,-1
 174 1434 l 1,3,-1
 348 1434 l 1,4,-1
 815 432 l 1,5,-1
 1282 1434 l 1,6,-1
 1456 1434 l 1,7,-1
 1456 0 l 1,8,-1
 1282 0 l 1,9,-1
 1282 1098 l 1,10,-1
 815 102 l 1,11,-1
 348 1098 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: N
Encoding: 78 78 41
Width: 1406
VWidth: 0
Flags: W
HStem: 0 43G<174 348 1034 1237> 1393 41G<174 375 1063 1237>
VStem: 174 174<0 1157> 1063 174<274 1434>
AnchorPoint: "horn" 1188 1085 basechar 0
AnchorPoint: "ogonek" 1143 0 basechar 0
AnchorPoint: "bottom" 694 0 basechar 0
AnchorPoint: "cedilla" 696 0 basechar 0
AnchorPoint: "top" 717 1434 basechar 0
LayerCount: 2
Fore
SplineSet
1059 0 m 1,0,-1
 348 1157 l 1,1,-1
 348 0 l 1,2,-1
 174 0 l 1,3,-1
 174 1434 l 1,4,-1
 350 1434 l 1,5,-1
 1063 274 l 1,6,-1
 1063 1434 l 1,7,-1
 1237 1434 l 1,8,-1
 1237 0 l 1,9,-1
 1059 0 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: O
Encoding: 79 79 42
Width: 1435
VWidth: 0
Flags: W
HStem: -20 102<572 877> 1352 102<551 871>
VStem: 102 174<441 1012> 1163 174<438 1009>
AnchorPoint: "cedilla" 700 0 basechar 0
AnchorPoint: "horn" 1217 1085 basechar 0
AnchorPoint: "bottom" 721 0 basechar 0
AnchorPoint: "ogonek" 725 0 basechar 0
AnchorPoint: "top" 707 1434 basechar 0
LayerCount: 2
Fore
SplineSet
946 24 m 128,-1,1
 834 -20 834 -20 727.5 -20 c 128,-1,2
 621 -20 621 -20 537.5 7 c 128,-1,3
 454 34 454 34 375 93 c 128,-1,4
 296 152 296 152 235.5 236 c 128,-1,5
 175 320 175 320 138.5 444.5 c 128,-1,6
 102 569 102 569 102 717 c 128,-1,7
 102 865 102 865 136 990 c 0,8,9
 170 1114 170 1114 228 1198 c 0,10,11
 289 1286 289 1286 362 1342 c 0,12,13
 508 1454 508 1454 686 1454 c 0,14,15
 900 1454 900 1454 1060 1342 c 0,16,17
 1337 1149 1337 1149 1337 720 c 0,18,19
 1337 530 1337 530 1286 387 c 0,20,21
 1235 243 1235 243 1146.5 155.5 c 128,-1,0
 1058 68 1058 68 946 24 c 128,-1,1
703 1352 m 0,22,23
 641 1352 641 1352 583 1328 c 128,-1,24
 525 1304 525 1304 470 1252 c 0,25,26
 416 1200 416 1200 372 1127 c 0,27,28
 276 967 276 967 276 717 c 0,29,30
 276 588 276 588 306 478.5 c 128,-1,31
 336 369 336 369 384 298 c 0,32,33
 432 226 432 226 491 176 c 0,34,35
 603 82 603 82 717 82 c 0,36,37
 849 82 849 82 961 182 c 0,38,39
 1163 363 1163 363 1163 717 c 0,40,41
 1163 1087 1163 1087 954 1258 c 0,42,43
 839 1352 839 1352 703 1352 c 0,22,23
EndSplineSet
Validated: 1
EndChar

StartChar: Q
Encoding: 81 81 43
Width: 1435
VWidth: 0
Flags: W
HStem: -348 102<985 1155> -14 96<554 634 801 882> 1352 102<525 883>
VStem: 102 174<429 1012> 1163 174<425 1009>
AnchorPoint: "horn" 1204 1085 basechar 0
AnchorPoint: "cedilla" 844 -262 basechar 0
AnchorPoint: "ogonek" 1004 -291 basechar 0
AnchorPoint: "bottom" 696 -266 basechar 0
AnchorPoint: "top" 690 1434 basechar 0
LayerCount: 2
Fore
SplineSet
391.5 1190 m 128,-1,1
 276 1028 276 1028 276 717 c 0,2,3
 276 348 276 348 475 176 c 0,4,5
 584 82 584 82 717 82 c 0,6,7
 888 82 888 82 1020 238 c 0,8,9
 1084 314 1084 314 1123.5 438 c 128,-1,10
 1163 562 1163 562 1163 721 c 128,-1,11
 1163 880 1163 880 1124 1006 c 0,12,13
 1084 1130 1084 1130 1018 1204 c 0,14,15
 885 1352 885 1352 696 1352 c 128,-1,0
 507 1352 507 1352 391.5 1190 c 128,-1,1
625 -14 m 1,16,17
 420 19 420 19 269 192 c 0,18,19
 193 279 193 279 147.5 414.5 c 128,-1,20
 102 550 102 550 102 707.5 c 128,-1,21
 102 865 102 865 136 990 c 0,22,23
 170 1114 170 1114 228 1198 c 0,24,25
 289 1286 289 1286 362 1342 c 0,26,27
 508 1454 508 1454 686 1454 c 0,28,29
 900 1454 900 1454 1060 1342 c 0,30,31
 1337 1149 1337 1149 1337 720 c 0,32,33
 1337 377 1337 377 1179 192 c 0,34,35
 1032 18 1032 18 801 -14 c 1,36,37
 819 -79 819 -79 880 -134 c 128,-1,38
 941 -189 941 -189 1015 -217.5 c 128,-1,39
 1089 -246 1089 -246 1155 -246 c 1,40,-1
 1155 -348 l 1,41,42
 1022 -348 1022 -348 924 -312.5 c 128,-1,43
 826 -277 826 -277 770 -240 c 128,-1,44
 714 -203 714 -203 674 -144.5 c 128,-1,45
 634 -86 634 -86 625 -14 c 1,16,17
EndSplineSet
Validated: 1
EndChar

StartChar: R
Encoding: 82 82 44
Width: 1118
VWidth: 0
Flags: W
HStem: 0 43G<174 348 901 1069> 655 102<348 615> 1331 102<348 757>
VStem: 174 174<0 655 758 1331> 864 174<873 1217> 901 168<0 202>
AnchorPoint: "horn" 954 1085 basechar 0
AnchorPoint: "ogonek" 975 0 basechar 0
AnchorPoint: "bottom" 594 0 basechar 0
AnchorPoint: "cedilla" 590 0 basechar 0
AnchorPoint: "top" 561 1434 basechar 0
LayerCount: 2
Fore
SplineSet
348 655 m 1,0,-1
 348 0 l 1,1,-1
 174 0 l 1,2,-1
 174 1434 l 1,3,-1
 594 1434 l 2,4,5
 857 1434 857 1434 976 1252 c 0,6,7
 1038 1157 1038 1157 1038 1044 c 0,8,9
 1038 937 1038 937 976 836 c 0,10,11
 907 725 907 725 762 680 c 1,12,13
 866 576 866 576 967.5 358 c 128,-1,14
 1069 140 1069 140 1069 0 c 1,15,-1
 901 0 l 1,16,17
 901 142 901 142 793 355 c 128,-1,18
 685 568 685 568 571 655 c 1,19,-1
 348 655 l 1,0,-1
348 1331 m 1,20,-1
 348 758 l 1,21,-1
 625 758 l 2,22,23
 749 758 749 758 810 856 c 0,24,25
 864 943 864 943 864 1044 c 0,26,27
 864 1145 864 1145 810 1233 c 0,28,29
 750 1331 750 1331 625 1331 c 2,30,-1
 348 1331 l 1,20,-1
EndSplineSet
Validated: 1
EndChar

StartChar: S
Encoding: 83 83 45
Width: 1187
VWidth: 0
Flags: W
HStem: -20 102<442 777> 1352 102<441 740>
VStem: 162 174<985 1247> 907 174<203 504>
AnchorPoint: "ogonek" 602 0 basechar 0
AnchorPoint: "horn" 897 1290 basechar 0
AnchorPoint: "bottom" 578 0 basechar 0
AnchorPoint: "cedilla" 573 0 basechar 0
AnchorPoint: "top" 569 1434 basechar 0
LayerCount: 2
Fore
SplineSet
102 350 m 1,0,-1
 262 381 l 1,1,2
 277 264 277 264 378 173 c 128,-1,3
 479 82 479 82 580 82 c 0,4,5
 737 82 737 82 822 157 c 128,-1,6
 907 232 907 232 907 365 c 0,7,8
 907 486 907 486 813 564 c 0,9,10
 739 625 739 625 636.5 667.5 c 128,-1,11
 534 710 534 710 472.5 736.5 c 128,-1,12
 411 763 411 763 355 796.5 c 128,-1,13
 299 830 299 830 256 870 c 0,14,15
 162 959 162 959 162 1102 c 0,16,17
 162 1198 162 1198 223.5 1280.5 c 128,-1,18
 285 1363 285 1363 380.5 1408.5 c 128,-1,19
 476 1454 476 1454 597 1454 c 128,-1,20
 718 1454 718 1454 833 1390.5 c 128,-1,21
 948 1327 948 1327 1012 1225 c 1,22,-1
 860 1182 l 1,23,24
 768 1352 768 1352 561 1352 c 0,25,26
 445 1352 445 1352 373 1236 c 0,27,28
 336 1176 336 1176 336 1112 c 128,-1,29
 336 1048 336 1048 361.5 1004 c 128,-1,30
 387 960 387 960 430 928.5 c 128,-1,31
 473 897 473 897 529 869 c 128,-1,32
 585 841 585 841 646.5 814.5 c 128,-1,33
 708 788 708 788 770 760 c 128,-1,34
 832 732 832 732 888 695 c 128,-1,35
 944 658 944 658 987 614 c 0,36,37
 1081 517 1081 517 1081 357 c 128,-1,38
 1081 197 1081 197 939.5 88.5 c 128,-1,39
 798 -20 798 -20 565 -20 c 0,40,41
 416 -20 416 -20 277.5 91 c 128,-1,42
 139 202 139 202 102 350 c 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: T
Encoding: 84 84 46
Width: 1280
VWidth: 0
Flags: W
HStem: 0 43G<553 727> 1331 102<41 553 727 1243>
VStem: 553 174<0 1331>
AnchorPoint: "horn" 1200 1389 basechar 0
AnchorPoint: "ogonek" 659 0 basechar 0
AnchorPoint: "bottom" 643 0 basechar 0
AnchorPoint: "cedilla" 639 0 basechar 0
AnchorPoint: "top" 643 1434 basechar 0
LayerCount: 2
Fore
SplineSet
41 1434 m 1,0,-1
 1243 1434 l 1,1,-1
 1243 1331 l 1,2,-1
 727 1331 l 1,3,-1
 727 0 l 1,4,-1
 553 0 l 1,5,-1
 553 1331 l 1,6,-1
 41 1331 l 1,7,-1
 41 1434 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: U
Encoding: 85 85 47
Width: 1402
VWidth: 0
Flags: W
HStem: -20 102<539 873> 1393 41G<156 330 1073 1247>
VStem: 156 174<328 1434> 1073 174<328 1434>
AnchorPoint: "cedilla" 692 0 basechar 0
AnchorPoint: "horn" 1247 1085 basechar 0
AnchorPoint: "bottom" 721 0 basechar 0
AnchorPoint: "ogonek" 717 0 basechar 0
AnchorPoint: "top" 721 1434 basechar 0
LayerCount: 2
Fore
SplineSet
1073 1434 m 1,0,-1
 1247 1434 l 1,1,-1
 1247 610 l 2,2,3
 1247 190 1247 190 1017 55 c 0,4,5
 890 -20 890 -20 696 -20 c 0,6,7
 538 -20 538 -20 412 55 c 0,8,9
 338 99 338 99 283 166.5 c 128,-1,10
 228 234 228 234 192 348.5 c 128,-1,11
 156 463 156 463 156 610 c 2,12,-1
 156 1434 l 1,13,-1
 330 1434 l 1,14,-1
 330 610 l 2,15,16
 330 203 330 203 574 108 c 0,17,18
 641 82 641 82 700.5 82 c 128,-1,19
 760 82 760 82 807 95 c 128,-1,20
 854 108 854 108 904 144.5 c 128,-1,21
 954 181 954 181 990 238 c 0,22,23
 1073 369 1073 369 1073 610 c 2,24,-1
 1073 1434 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: V
Encoding: 86 86 48
Width: 1153
VWidth: 0
Flags: W
HStem: 0 43G<476 683> 1393 41G<25 189 970 1135>
AnchorPoint: "cedilla" 578 0 basechar 0
AnchorPoint: "ogonek" 578 0 basechar 0
AnchorPoint: "horn" 983 1085 basechar 0
AnchorPoint: "bottom" 578 0 basechar 0
AnchorPoint: "top" 573 1434 basechar 0
LayerCount: 2
Fore
SplineSet
489 0 m 1,0,-1
 25 1434 l 1,1,-1
 176 1434 l 1,2,-1
 580 195 l 1,3,-1
 983 1434 l 1,4,-1
 1135 1434 l 1,5,-1
 670 0 l 1,6,-1
 489 0 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: X
Encoding: 88 88 49
Width: 1191
VWidth: 0
Flags: W
HStem: 0 43G<86 279 847 1042> 1393 41G<127 322 804 999>
AnchorPoint: "horn" 766 1085 basechar 0
AnchorPoint: "ogonek" 553 0 basechar 0
AnchorPoint: "cedilla" 553 0 basechar 0
AnchorPoint: "bottom" 557 0 basechar 0
AnchorPoint: "top" 557 1434 basechar 0
LayerCount: 2
Fore
SplineSet
258 0 m 1,0,-1
 86 0 l 1,1,-1
 477 758 l 1,2,-1
 127 1434 l 1,3,-1
 301 1434 l 1,4,-1
 563 926 l 1,5,-1
 825 1434 l 1,6,-1
 999 1434 l 1,7,-1
 651 758 l 1,8,-1
 1042 0 l 1,9,-1
 868 0 l 1,10,-1
 563 590 l 1,11,-1
 258 0 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: W
Encoding: 87 87 50
Width: 1771
VWidth: 0
Flags: W
HStem: 0 43G<486 693 1087 1293> 860 41G<808 972> 1393 41G<35 200 1580 1745>
AnchorPoint: "horn" 1577 1085 basechar 0
AnchorPoint: "ogonek" 1188 0 basechar 0
AnchorPoint: "cedilla" 881 0 basechar 0
AnchorPoint: "bottom" 899 0 basechar 0
AnchorPoint: "top" 874 1434 basechar 0
LayerCount: 2
Fore
SplineSet
500 0 m 1,0,-1
 35 1434 l 1,1,-1
 186 1434 l 1,2,-1
 590 193 l 1,3,-1
 821 901 l 1,4,-1
 958 901 l 1,5,-1
 1190 193 l 1,6,-1
 1593 1434 l 1,7,-1
 1745 1434 l 1,8,-1
 1280 0 l 1,9,-1
 1100 0 l 1,10,-1
 891 645 l 1,11,-1
 680 0 l 1,12,-1
 500 0 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: Y
Encoding: 89 89 51
Width: 952
VWidth: 0
Flags: W
HStem: 0 43G<391 565> 1393 41G<23 228 731 936>
VStem: 391 174<0 709>
AnchorPoint: "horn" 725 1085 basechar 0
AnchorPoint: "cedilla" 492 0 basechar 0
AnchorPoint: "ogonek" 510 0 basechar 0
AnchorPoint: "bottom" 477 0 basechar 0
AnchorPoint: "top" 477 1434 basechar 0
LayerCount: 2
Fore
SplineSet
479 899 m 1,0,-1
 752 1434 l 1,1,-1
 936 1434 l 1,2,-1
 565 709 l 1,3,-1
 565 0 l 1,4,-1
 391 0 l 1,5,-1
 391 711 l 1,6,-1
 23 1434 l 1,7,-1
 207 1434 l 1,8,-1
 479 899 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: Z
Encoding: 90 90 52
Width: 1040
VWidth: 0
Flags: W
HStem: 0 102<285 983> 1331 102<102 750>
AnchorPoint: "horn" 758 1085 basechar 0
AnchorPoint: "cedilla" 569 0 basechar 0
AnchorPoint: "ogonek" 799 0 basechar 0
AnchorPoint: "bottom" 549 0 basechar 0
AnchorPoint: "top" 512 1434 basechar 0
LayerCount: 2
Fore
SplineSet
750 1331 m 1,0,-1
 72 1331 l 1,1,-1
 102 1434 l 1,2,-1
 975 1434 l 1,3,-1
 285 102 l 1,4,-1
 983 102 l 1,5,-1
 983 0 l 1,6,-1
 61 0 l 1,7,-1
 750 1331 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: exclam
Encoding: 33 33 53
Width: 356
VWidth: 0
Flags: W
HStem: 0 164<92 256> 1393 41G<92 256>
VStem: 92 164<0 164 937 1434> 123 102<369 866>
LayerCount: 2
Fore
SplineSet
92 164 m 1,0,-1
 256 164 l 1,1,-1
 256 0 l 1,2,-1
 92 0 l 1,3,-1
 92 164 l 1,0,-1
256 1434 m 29,4,-1
 225 369 l 1,5,-1
 123 369 l 1,6,-1
 92 1434 l 1,7,-1
 256 1434 l 29,4,-1
EndSplineSet
Validated: 1
EndChar

StartChar: period
Encoding: 46 46 54
Width: 356
VWidth: 0
Flags: W
HStem: 0 164<92 256>
VStem: 92 164<0 164>
LayerCount: 2
Fore
SplineSet
92 164 m 1,0,-1
 256 164 l 1,1,-1
 256 0 l 1,2,-1
 92 0 l 1,3,-1
 92 164 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: comma
Encoding: 44 44 55
Width: 356
VWidth: 0
Flags: W
HStem: -203 367<141 175>
VStem: 98 147<-48 164>
LayerCount: 2
Fore
SplineSet
98 164 m 1,0,-1
 246 164 l 1,1,2
 246 -73 246 -73 182 -180 c 0,3,4
 170 -199 170 -199 168 -203 c 1,5,-1
 92 -203 l 1,6,7
 141 -134 141 -134 141 -51 c 0,8,9
 141 -26 141 -26 119.5 44 c 128,-1,10
 98 114 98 114 98 164 c 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: quotesingle
Encoding: 39 39 56
Width: 335
VWidth: 0
Flags: W
HStem: 1024 410<123 205>
VStem: 123 82<1024 1215>
LayerCount: 2
Fore
SplineSet
236 1434 m 25,0,-1
 205 1024 l 1,1,-1
 123 1024 l 1,2,-1
 92 1434 l 1,3,-1
 236 1434 l 25,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: quotedbl
Encoding: 34 34 57
Width: 540
VWidth: 0
Flags: W
HStem: 1024 410<123 205 328 410>
VStem: 123 82<1024 1215> 328 82<1024 1215>
LayerCount: 2
Fore
Refer: 56 39 N 1 0 0 1 0 0 2
Refer: 56 39 N 1 0 0 1 205 0 2
Validated: 1
EndChar

StartChar: dollar
Encoding: 36 36 58
Width: 860
VWidth: 0
Flags: W
HStem: 0 43G<303 377 459 532> 150 102<377 459> 1112 102<377 459> 1311 41G<303 377 459 532>
VStem: 61 164<851 1058> 303 74<0 150 270 662 825 1085 1214 1352> 459 74<0 152 272 610 772 1077 1208 1352> 625 164<314 570>
LayerCount: 2
Fore
SplineSet
729 1087 m 1,0,-1
 610 1016 l 1,1,2
 545 1069 545 1069 532 1077 c 1,3,-1
 532 752 l 1,4,5
 660 708 660 708 724 631 c 128,-1,6
 788 554 788 554 788 451.5 c 128,-1,7
 788 349 788 349 718.5 271 c 128,-1,8
 649 193 649 193 532 164 c 1,9,-1
 532 0 l 1,10,-1
 459 0 l 1,11,-1
 459 152 l 1,12,13
 443 150 443 150 408 150 c 2,14,-1
 377 150 l 1,15,-1
 377 0 l 1,16,-1
 303 0 l 1,17,-1
 303 160 l 1,18,19
 222 176 222 176 148 226 c 0,20,21
 122 244 122 244 61 287 c 1,22,-1
 150 362 l 1,23,24
 158 357 158 357 178.5 342 c 128,-1,25
 199 327 199 327 206 322.5 c 128,-1,26
 213 318 213 318 229 307.5 c 128,-1,27
 245 297 245 297 254 292 c 0,28,29
 282 276 282 276 303 270 c 1,30,-1
 303 682 l 1,31,32
 190 720 190 720 125.5 789 c 128,-1,33
 61 858 61 858 61 958 c 128,-1,34
 61 1058 61 1058 127 1126.5 c 128,-1,35
 193 1195 193 1195 303 1210 c 1,36,-1
 303 1352 l 1,37,-1
 377 1352 l 1,38,-1
 377 1214 l 1,39,40
 418 1214 418 1214 459 1208 c 1,41,-1
 459 1352 l 1,42,-1
 532 1352 l 1,43,-1
 532 1192 l 1,44,45
 620 1162 620 1162 729 1087 c 1,0,-1
303 825 m 1,46,-1
 303 1085 l 1,47,48
 225 1038 225 1038 225 955.5 c 128,-1,49
 225 873 225 873 303 825 c 1,46,-1
377 662 m 1,50,-1
 377 254 l 1,51,52
 395 252 395 252 438 252 c 2,53,-1
 459 252 l 1,54,-1
 459 643 l 1,55,56
 433 650 433 650 377 662 c 1,50,-1
377 791 m 1,57,58
 411 781 411 781 459 772 c 1,59,-1
 459 1108 l 1,60,61
 427 1112 427 1112 405 1112 c 128,-1,62
 383 1112 383 1112 377 1110 c 1,63,-1
 377 791 l 1,57,58
532 272 m 1,64,65
 625 321 625 321 625 463 c 0,66,67
 625 551 625 551 532 610 c 1,68,-1
 532 272 l 1,64,65
EndSplineSet
Validated: 1
EndChar

StartChar: bar
Encoding: 124 124 59
Width: 305
VWidth: 0
Flags: W
HStem: 0 43G<92 205> 1393 41G<92 205>
VStem: 92 113<0 1434>
LayerCount: 2
Fore
SplineSet
205 1434 m 25,0,-1
 205 0 l 1,1,-1
 92 0 l 1,2,-1
 92 1434 l 1,3,-1
 205 1434 l 25,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: slash
Encoding: 47 47 60
Width: 831
VWidth: 0
Flags: W
HStem: 0 43G<61 199> 1393 41G<624 762>
LayerCount: 2
Fore
SplineSet
762 1434 m 1,0,-1
 182 0 l 1,1,-1
 61 0 l 1,2,-1
 641 1434 l 1,3,-1
 762 1434 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: backslash
Encoding: 92 92 61
Width: 831
VWidth: 0
Flags: W
HStem: 0 43G<624 762> 1393 41G<61 199>
LayerCount: 2
Fore
SplineSet
61 1434 m 1,0,-1
 182 1434 l 1,1,-1
 762 0 l 1,2,-1
 641 0 l 1,3,-1
 61 1434 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: question
Encoding: 63 63 62
Width: 882
VWidth: 0
Flags: W
HStem: 0 164<297 461> 369 215<328 430> 1270 102<226 519>
VStem: 297 164<0 164> 328 102<369 469> 657 164<716 1117>
LayerCount: 2
Fore
SplineSet
297 164 m 1,0,-1
 461 164 l 1,1,-1
 461 0 l 1,2,-1
 297 0 l 1,3,-1
 297 164 l 1,0,-1
446 483 m 1,4,-1
 430 369 l 1,5,-1
 328 369 l 1,6,-1
 297 584 l 1,7,-1
 369 584 l 2,8,9
 494 584 494 584 575.5 663 c 128,-1,10
 657 742 657 742 657 907.5 c 128,-1,11
 657 1073 657 1073 579.5 1171.5 c 128,-1,12
 502 1270 502 1270 358 1270 c 0,13,14
 264 1270 264 1270 212 1214 c 0,15,16
 190 1190 190 1190 164 1147 c 1,17,-1
 41 1194 l 1,18,19
 109 1280 109 1280 190 1326 c 128,-1,20
 271 1372 271 1372 389 1372 c 0,21,22
 588 1372 588 1372 704.5 1244.5 c 128,-1,23
 821 1117 821 1117 821 901 c 0,24,25
 821 626 821 626 585 520 c 0,26,27
 519 490 519 490 446 483 c 1,4,-1
EndSplineSet
Validated: 1
EndChar

StartChar: colon
Encoding: 58 58 63
Width: 356
VWidth: 0
Flags: W
HStem: 0 164<92 256> 614 164<92 256>
VStem: 92 164<0 164 614 778>
LayerCount: 2
Fore
Refer: 54 46 N 1 0 0 1 0 0 2
Refer: 54 46 N 1 0 0 1 0 614 2
Validated: 1
EndChar

StartChar: semicolon
Encoding: 59 59 64
Width: 356
VWidth: 0
Flags: W
HStem: -203 367<141 175> 614 164<92 256>
VStem: 92 164<614 778> 98 147<-48 164>
LayerCount: 2
Fore
Refer: 55 44 N 1 0 0 1 0 0 2
Refer: 54 46 N 1 0 0 1 0 614 2
Validated: 1
EndChar

StartChar: percent
Encoding: 37 37 65
Width: 1089
VWidth: 0
Flags: W
HStem: 156 109<702 871> 473 109<702 871> 729 109<211 379> 1047 109<211 379>
VStem: 82 109<858 1026> 399 109<858 1026> 573 109<284 453> 891 109<284 453>
LayerCount: 2
Fore
SplineSet
682 369 m 128,-1,1
 682 326 682 326 712.5 295 c 128,-1,2
 743 264 743 264 786 264 c 128,-1,3
 829 264 829 264 860 295 c 128,-1,4
 891 326 891 326 891 369 c 128,-1,5
 891 412 891 412 860 442.5 c 128,-1,6
 829 473 829 473 786 473 c 128,-1,7
 743 473 743 473 712.5 442.5 c 128,-1,0
 682 412 682 412 682 369 c 128,-1,1
573 369 m 128,-1,9
 573 458 573 458 635 520 c 128,-1,10
 697 582 697 582 786 582 c 128,-1,11
 875 582 875 582 937 520 c 128,-1,12
 999 458 999 458 999 369 c 128,-1,13
 999 280 999 280 937 218 c 128,-1,14
 875 156 875 156 786 156 c 128,-1,15
 697 156 697 156 635 218 c 128,-1,8
 573 280 573 280 573 369 c 128,-1,9
190 942 m 128,-1,17
 190 899 190 899 221 868.5 c 128,-1,18
 252 838 252 838 295 838 c 128,-1,19
 338 838 338 838 368.5 868.5 c 128,-1,20
 399 899 399 899 399 942 c 128,-1,21
 399 985 399 985 368.5 1016 c 128,-1,22
 338 1047 338 1047 295 1047 c 128,-1,23
 252 1047 252 1047 221 1016 c 128,-1,16
 190 985 190 985 190 942 c 128,-1,17
82 942 m 128,-1,25
 82 1031 82 1031 144 1093 c 128,-1,26
 206 1155 206 1155 295 1155 c 128,-1,27
 384 1155 384 1155 446 1093 c 128,-1,28
 508 1031 508 1031 508 942 c 128,-1,29
 508 853 508 853 446 791 c 128,-1,30
 384 729 384 729 295 729 c 128,-1,31
 206 729 206 729 144 791 c 128,-1,24
 82 853 82 853 82 942 c 128,-1,25
82 264 m 5,32,-1
 842 1047 l 1,33,-1
 999 1047 l 1,34,-1
 240 264 l 1,35,-1
 82 264 l 5,32,-1
EndSplineSet
Validated: 1
EndChar

StartChar: numbersign
Encoding: 35 35 66
Width: 991
VWidth: 0
Flags: W
HStem: 410 102<102 227 389 526 690 838> 840 102<154 303 465 602 766 889>
LayerCount: 2
Fore
SplineSet
373 410 m 1,0,-1
 322 123 l 1,1,-1
 176 123 l 1,2,-1
 227 410 l 1,3,-1
 102 410 l 1,4,-1
 102 512 l 1,5,-1
 244 512 l 1,6,-1
 303 840 l 1,7,-1
 154 840 l 1,8,-1
 154 942 l 1,9,-1
 319 942 l 1,10,-1
 371 1229 l 1,11,-1
 516 1229 l 1,12,-1
 465 942 l 1,13,-1
 621 942 l 1,14,-1
 670 1229 l 1,15,-1
 815 1229 l 1,16,-1
 766 942 l 1,17,-1
 889 942 l 1,18,-1
 889 840 l 1,19,-1
 748 840 l 1,20,-1
 690 512 l 1,21,-1
 838 512 l 1,22,-1
 838 410 l 1,23,-1
 672 410 l 1,24,-1
 623 123 l 1,25,-1
 477 123 l 1,26,-1
 526 410 l 1,27,-1
 373 410 l 1,0,-1
389 512 m 1,28,-1
 545 512 l 1,29,-1
 602 840 l 1,30,-1
 449 840 l 1,31,-1
 389 512 l 1,28,-1
EndSplineSet
Validated: 1
EndChar

StartChar: zero
Encoding: 48 48 67
Width: 942
VWidth: 0
Flags: W
HStem: -20 102<357 586> 1004 102<375 586>
VStem: 31 164<287 766> 748 164<299 786>
LayerCount: 2
Fore
SplineSet
748 543 m 128,-1,1
 748 653 748 653 714 758 c 0,2,3
 681 864 681 864 619 934 c 128,-1,4
 557 1004 557 1004 482 1004 c 0,5,6
 408 1004 408 1004 341 936 c 128,-1,7
 274 868 274 868 234.5 761 c 128,-1,8
 195 654 195 654 195 555 c 128,-1,9
 195 456 195 456 213 375.5 c 128,-1,10
 231 295 231 295 265.5 228.5 c 128,-1,11
 300 162 300 162 356.5 122 c 128,-1,12
 413 82 413 82 485 82 c 128,-1,13
 557 82 557 82 619 152.5 c 128,-1,14
 681 223 681 223 714.5 328 c 128,-1,0
 748 433 748 433 748 543 c 128,-1,1
911 543 m 128,-1,16
 911 387 911 387 852.5 258.5 c 128,-1,17
 794 130 794 130 688.5 55 c 128,-1,18
 583 -20 583 -20 454 -20 c 128,-1,19
 325 -20 325 -20 227 61.5 c 128,-1,20
 129 143 129 143 80 270 c 128,-1,21
 31 397 31 397 31 540 c 128,-1,22
 31 683 31 683 93.5 814.5 c 128,-1,23
 156 946 156 946 254 1026 c 128,-1,24
 352 1106 352 1106 468 1106 c 128,-1,25
 584 1106 584 1106 689 1031 c 128,-1,26
 794 956 794 956 852.5 827.5 c 128,-1,15
 911 699 911 699 911 543 c 128,-1,16
EndSplineSet
Validated: 1
EndChar

StartChar: one
Encoding: 49 49 68
Width: 942
VWidth: 0
Flags: W
HStem: 0 43G<410 573> 961 102<305 410>
VStem: 410 164<0 973>
LayerCount: 2
Fore
SplineSet
573 1096 m 1,0,-1
 573 0 l 1,1,-1
 410 0 l 1,2,-1
 410 973 l 1,3,-1
 305 961 l 1,4,-1
 305 1063 l 1,5,-1
 573 1096 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: two
Encoding: 50 50 69
Width: 942
VWidth: 0
Flags: W
HStem: 0 102<287 819> 983 102<331 582>
VStem: 123 164<102 201> 649 164<627 912>
LayerCount: 2
Fore
SplineSet
123 0 m 1,0,1
 124 184 124 184 228 302 c 0,2,3
 302 385 302 385 400 452.5 c 128,-1,4
 498 520 498 520 544 559 c 0,5,6
 648 647 648 647 649 762 c 0,7,8
 649 875 649 875 596 929 c 128,-1,9
 543 983 543 983 472 983 c 0,10,11
 313 983 313 983 252 827 c 1,12,-1
 123 877 l 1,13,14
 222 1085 222 1085 500 1085 c 0,15,16
 633 1085 633 1085 722.5 993 c 128,-1,17
 812 901 812 901 812 765.5 c 128,-1,18
 812 630 812 630 708 536 c 0,19,20
 649 483 649 483 543.5 413 c 128,-1,21
 438 343 438 343 392 304 c 0,22,23
 288 216 288 216 287 102 c 1,24,-1
 819 102 l 1,25,-1
 819 0 l 1,26,-1
 123 0 l 1,0,1
EndSplineSet
Validated: 1
EndChar

StartChar: three
Encoding: 51 51 70
Width: 942
VWidth: 0
Flags: W
HStem: -258 102<316 565> 422 102<379 553> 983 102<332 572>
VStem: 639 164<606 912> 678 164<-36 295>
LayerCount: 2
Fore
SplineSet
379 422 m 5,0,-1
 379 524 l 1,1,2
 639 524 639 524 639 760 c 0,3,4
 639 872 639 872 585.5 927.5 c 128,-1,5
 532 983 532 983 456.5 983 c 128,-1,6
 381 983 381 983 337 945 c 128,-1,7
 293 907 293 907 262 827 c 1,8,-1
 133 877 l 1,9,10
 180 975 180 975 262 1030 c 128,-1,11
 344 1085 344 1085 483 1085 c 128,-1,12
 622 1085 622 1085 712.5 992 c 128,-1,13
 803 899 803 899 803 760 c 0,14,15
 803 558 803 558 639 473 c 1,16,17
 842 375 842 375 842 115 c 0,18,19
 842 -33 842 -33 732.5 -145.5 c 128,-1,20
 623 -258 623 -258 482 -258 c 128,-1,21
 341 -258 341 -258 243 -198.5 c 128,-1,22
 145 -139 145 -139 100 -45 c 1,23,-1
 229 4 l 1,24,25
 259 -72 259 -72 318.5 -114 c 128,-1,26
 378 -156 378 -156 454.5 -156 c 128,-1,27
 531 -156 531 -156 604.5 -76.5 c 128,-1,28
 678 3 678 3 678 115 c 0,29,30
 678 242 678 242 614 328 c 0,31,32
 542 422 542 422 379 422 c 5,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: four
Encoding: 52 52 71
Width: 942
VWidth: 0
Flags: W
HStem: 0 102<225 571 735 846>
VStem: 571 164<-238 0 102 844>
LayerCount: 2
Fore
SplineSet
96 68 m 1,0,-1
 571 1085 l 1,1,-1
 735 1085 l 1,2,-1
 735 102 l 1,3,-1
 846 102 l 1,4,-1
 846 0 l 1,5,-1
 735 0 l 1,6,-1
 735 -238 l 1,7,-1
 571 -238 l 1,8,-1
 571 0 l 1,9,-1
 96 0 l 1,10,-1
 96 68 l 1,0,-1
571 102 m 1,11,-1
 571 844 l 1,12,-1
 225 102 l 1,13,-1
 571 102 l 1,11,-1
EndSplineSet
Validated: 1
EndChar

StartChar: five
Encoding: 53 53 72
Width: 942
VWidth: 0
Flags: W
HStem: -258 102<316 565> 983 102<422 733>
VStem: 678 164<-27 366>
LayerCount: 2
Fore
SplineSet
182 555 m 1,0,-1
 274 1085 l 1,1,-1
 733 1085 l 1,2,-1
 733 983 l 1,3,-1
 422 983 l 1,4,-1
 365 647 l 1,5,6
 682 614 682 614 783 434 c 0,7,8
 842 329 842 329 842 166 c 0,9,10
 842 73 842 73 812 -8 c 0,11,12
 782 -88 782 -88 732 -142 c 0,13,14
 625 -258 625 -258 483 -258 c 128,-1,15
 341 -258 341 -258 243 -198.5 c 128,-1,16
 145 -139 145 -139 100 -45 c 1,17,-1
 229 4 l 1,18,19
 259 -72 259 -72 318.5 -114 c 128,-1,20
 378 -156 378 -156 459 -156 c 0,21,22
 532 -156 532 -156 600 -78 c 0,23,24
 678 10 678 10 678 166 c 0,25,26
 678 453 678 453 425 526 c 0,27,28
 325 555 325 555 182 555 c 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: six
Encoding: 54 54 73
Width: 942
VWidth: 0
Flags: W
HStem: -20 102<357 570> 586 102<311 581>
VStem: 111 164<186 545> 668 164<187 496>
LayerCount: 2
Fore
SplineSet
285 555 m 1,0,1
 274 458 274 458 274 385 c 0,2,3
 274 240 274 240 326.5 161 c 128,-1,4
 379 82 379 82 462.5 82 c 128,-1,5
 546 82 546 82 607 162.5 c 128,-1,6
 668 243 668 243 668 342.5 c 128,-1,7
 668 442 668 442 611 514 c 128,-1,8
 554 586 554 586 472 586 c 128,-1,9
 390 586 390 586 285 555 c 1,0,1
309 674 m 1,10,11
 369 688 369 688 446 688 c 0,12,13
 608 688 608 688 719.5 593.5 c 128,-1,14
 831 499 831 499 831 351 c 128,-1,15
 831 203 831 203 730.5 91.5 c 128,-1,16
 630 -20 630 -20 478.5 -20 c 128,-1,17
 327 -20 327 -20 219 90 c 128,-1,18
 111 200 111 200 111 385 c 0,19,20
 112 682 112 682 264 946 c 0,21,22
 335 1069 335 1069 454 1191 c 0,23,24
 520 1257 520 1257 590 1309 c 0,25,26
 660 1360 660 1360 680 1372 c 2,27,-1
 700 1384 l 1,28,-1
 770 1323 l 1,29,30
 717 1292 717 1292 646 1229.5 c 128,-1,31
 575 1167 575 1167 518 1099 c 128,-1,32
 461 1031 461 1031 400.5 916 c 128,-1,33
 340 801 340 801 309 674 c 1,10,11
EndSplineSet
Validated: 1
EndChar

StartChar: seven
Encoding: 55 55 74
Width: 942
VWidth: 0
Flags: W
HStem: 983 102<170 637>
VStem: 139 664
LayerCount: 2
Fore
SplineSet
170 1085 m 1,0,-1
 803 1085 l 1,1,-1
 803 983 l 1,2,-1
 475 -238 l 1,3,-1
 309 -238 l 1,4,-1
 637 983 l 1,5,-1
 139 983 l 1,6,-1
 170 1085 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: nine
Encoding: 57 57 75
Width: 942
VWidth: 0
Flags: W
HStem: 397 102<361 631> 1004 102<338 565>
VStem: 111 164<590 910> 668 164<540 890>
LayerCount: 2
Fore
SplineSet
657 530 m 1,0,1
 668 627 668 627 668 700 c 0,2,3
 668 841 668 841 602.5 922.5 c 128,-1,4
 537 1004 537 1004 453 1004 c 0,5,6
 274 1004 274 1004 274 733 c 0,7,8
 274 644 274 644 331 572 c 128,-1,9
 388 500 388 500 471.5 500 c 128,-1,10
 555 500 555 500 657 530 c 1,0,1
633 412 m 1,11,12
 568 397 568 397 496 397 c 0,13,14
 334 397 334 397 222.5 491.5 c 128,-1,15
 111 586 111 586 111 736 c 128,-1,16
 111 886 111 886 215 996 c 128,-1,17
 319 1106 319 1106 483 1106 c 0,18,19
 616 1106 616 1106 722 998 c 0,20,21
 831 887 831 887 831 703 c 0,22,23
 830 403 830 403 678 139 c 0,24,25
 610 20 610 20 488 -106 c 0,26,27
 424 -172 424 -172 353 -224 c 128,-1,28
 282 -276 282 -276 262 -288 c 2,29,-1
 242 -299 l 1,30,-1
 172 -238 l 1,31,32
 284 -172 284 -172 404 -34 c 0,33,34
 570 160 570 160 633 412 c 1,11,12
EndSplineSet
Validated: 1
EndChar

StartChar: eight
Encoding: 56 56 76
Width: 942
VWidth: 0
Flags: W
HStem: -20 102<342 623> 1352 102<368 575>
VStem: 61 174<198 550> 111 174<963 1265> 676 174<937 1242> 707 174<184 523>
LayerCount: 2
Fore
SplineSet
520 821 m 1,0,1
 676 936 676 936 676 1085 c 0,2,3
 676 1196 676 1196 611.5 1274 c 128,-1,4
 547 1352 547 1352 472.5 1352 c 128,-1,5
 398 1352 398 1352 341.5 1284 c 128,-1,6
 285 1216 285 1216 285 1102 c 0,7,8
 286 998 286 998 358 932 c 0,9,10
 416 878 416 878 520 821 c 1,0,1
645 752 m 1,11,12
 818 643 818 643 862 501 c 0,13,14
 880 440 880 440 881 365 c 0,15,16
 881 196 881 196 765.5 88 c 128,-1,17
 650 -20 650 -20 468 -20 c 128,-1,18
 286 -20 286 -20 173.5 93.5 c 128,-1,19
 61 207 61 207 61 365 c 0,20,21
 61 614 61 614 317 760 c 1,22,23
 254 799 254 799 212 840 c 128,-1,24
 170 881 170 881 140.5 948.5 c 128,-1,25
 111 1016 111 1016 111 1107.5 c 128,-1,26
 111 1199 111 1199 163.5 1280.5 c 128,-1,27
 216 1362 216 1362 303.5 1408 c 128,-1,28
 391 1454 391 1454 492 1454 c 0,29,30
 641 1454 641 1454 745.5 1348.5 c 128,-1,31
 850 1243 850 1243 850 1085 c 0,32,33
 850 892 850 892 645 752 c 1,11,12
430 698 m 1,34,35
 236 589 236 589 236 365 c 0,36,37
 236 246 236 246 303 164 c 128,-1,38
 370 82 370 82 484 82 c 0,39,40
 707 82 707 82 707 365 c 0,41,42
 707 483 707 483 642 552 c 0,43,44
 578 619 578 619 490 666 c 0,45,46
 470 677 470 677 430 698 c 1,34,35
EndSplineSet
Validated: 1
EndChar

StartChar: ampersand
Encoding: 38 38 77
Width: 1163
VWidth: 0
Flags: W
HStem: -20 102<390 735> 0 43G<901 1061> 1270 102<499 704>
VStem: 61 164<253 652> 311 139<913 1223> 963 123<452 829>
LayerCount: 2
Fore
SplineSet
889 1208 m 1,0,-1
 731 1174 l 1,1,2
 707 1225 707 1225 689 1242 c 0,3,4
 661 1270 661 1270 591.5 1270 c 128,-1,5
 522 1270 522 1270 486.5 1212.5 c 128,-1,6
 451 1155 451 1155 451 1090 c 0,7,8
 451 1024 451 1024 484 942 c 0,9,10
 528 832 528 832 598 725 c 2,11,-1
 877 289 l 1,12,13
 963 476 963 476 963 877 c 1,14,-1
 1085 829 l 1,15,16
 1085 425 1085 425 934 199 c 1,17,-1
 1061 0 l 1,18,-1
 928 0 l 1,19,-1
 858 109 l 1,20,21
 726 -20 726 -20 524 -20 c 128,-1,22
 322 -20 322 -20 191.5 109.5 c 128,-1,23
 61 239 61 239 61 451 c 0,24,25
 61 615 61 615 147 735 c 128,-1,26
 233 855 233 855 360 899 c 1,27,28
 311 999 311 999 311 1081 c 0,29,30
 311 1236 311 1236 382.5 1304 c 128,-1,31
 454 1372 454 1372 618 1372 c 0,32,33
 815 1372 815 1372 889 1208 c 1,0,-1
418 799 m 1,34,35
 332 762 332 762 278.5 670.5 c 128,-1,36
 225 579 225 579 225 431 c 128,-1,37
 225 283 225 283 316.5 182.5 c 128,-1,38
 408 82 408 82 563 82 c 128,-1,39
 718 82 718 82 809 184 c 1,40,-1
 418 799 l 1,34,35
EndSplineSet
Validated: 1
EndChar

StartChar: parenleft
Encoding: 40 40 78
Width: 548
VWidth: 0
Flags: W
HStem: 0 43G<330 446> 1393 41G<330 446>
VStem: 102 164<373 1061>
LayerCount: 2
Fore
SplineSet
128 446 m 128,-1,1
 102 574 102 574 102 697.5 c 128,-1,2
 102 821 102 821 115.5 917.5 c 128,-1,3
 129 1014 129 1014 150 1083.5 c 128,-1,4
 171 1153 171 1153 197 1213.5 c 128,-1,5
 223 1274 223 1274 249 1314 c 0,6,7
 304 1397 304 1397 344 1434 c 1,8,-1
 446 1434 l 1,9,10
 335 1273 335 1273 286 972 c 0,11,12
 266 848 266 848 266 716 c 128,-1,13
 266 584 266 584 284 462 c 0,14,15
 300 351 300 351 330 260 c 0,16,17
 386 92 386 92 428 28 c 2,18,-1
 446 0 l 1,19,-1
 344 0 l 1,20,21
 314 24 314 24 266 96 c 128,-1,22
 218 168 218 168 186 243 c 128,-1,0
 154 318 154 318 128 446 c 128,-1,1
EndSplineSet
Validated: 1
EndChar

StartChar: parenright
Encoding: 41 41 79
Width: 548
VWidth: 0
Flags: W
HStem: 0 43G<102 219> 1393 41G<102 219>
VStem: 283 164<373 1061>
LayerCount: 2
Fore
SplineSet
420 988 m 128,-1,1
 446 860 446 860 446 736.5 c 128,-1,2
 446 613 446 613 432.5 516.5 c 128,-1,3
 419 420 419 420 398 350 c 128,-1,4
 377 280 377 280 351 220 c 0,5,6
 323 155 323 155 300 120 c 0,7,8
 247 38 247 38 205 0 c 1,9,-1
 102 0 l 1,10,11
 216 164 216 164 264 462 c 0,12,13
 284 583 284 583 284 711 c 0,14,15
 284 714 284 714 284 718 c 0,16,17
 284 850 284 850 265 972 c 128,-1,18
 246 1094 246 1094 219 1174 c 0,19,20
 162 1344 162 1344 120 1406 c 2,21,-1
 102 1434 l 1,22,-1
 205 1434 l 1,23,24
 235 1410 235 1410 282.5 1338 c 128,-1,25
 330 1266 330 1266 362 1191 c 128,-1,0
 394 1116 394 1116 420 988 c 128,-1,1
EndSplineSet
Validated: 1
EndChar

StartChar: asterisk
Encoding: 42 42 80
Width: 864
VWidth: 0
Flags: W
HStem: 678 674
LayerCount: 2
Fore
SplineSet
391 1057 m 1,0,-1
 369 1352 l 1,1,-1
 496 1352 l 1,2,-1
 473 1057 l 1,3,-1
 748 1169 l 1,4,-1
 786 1049 l 1,5,-1
 498 979 l 1,6,-1
 690 754 l 1,7,-1
 588 678 l 1,8,-1
 432 930 l 1,9,-1
 276 678 l 1,10,-1
 174 754 l 1,11,-1
 367 979 l 1,12,-1
 78 1049 l 1,13,-1
 117 1169 l 1,14,-1
 391 1057 l 1,0,-1
391 1057 m 1,15,-1
367 979 m 1,16,-1
432 930 m 1,17,-1
498 979 m 1,18,-1
473 1057 m 1,19,-1
EndSplineSet
Validated: 1
EndChar

StartChar: plus
Encoding: 43 43 81
Width: 856
VWidth: 0
Flags: W
HStem: 348 102<82 377 479 774>
VStem: 377 102<53 348 451 745>
LayerCount: 2
Fore
SplineSet
479 348 m 1,0,-1
 479 53 l 1,1,-1
 377 53 l 1,2,-1
 377 348 l 1,3,-1
 82 348 l 1,4,-1
 82 451 l 1,5,-1
 377 451 l 1,6,-1
 377 745 l 1,7,-1
 479 745 l 1,8,-1
 479 451 l 1,9,-1
 774 451 l 1,10,-1
 774 348 l 1,11,-1
 479 348 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: hyphen
Encoding: 45 45 82
Width: 649
VWidth: 0
Flags: W
HStem: 348 102<82 567>
VStem: 82 485<348 451>
LayerCount: 2
Fore
SplineSet
82 451 m 1,0,-1
 567 451 l 1,1,-1
 567 348 l 1,2,-1
 82 348 l 1,3,-1
 82 451 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: less
Encoding: 60 60 83
Width: 856
VWidth: 0
Flags: W
HStem: 860 41G<623 711>
VStem: 115 627
LayerCount: 2
Fore
SplineSet
115 504 m 1,0,-1
 682 901 l 1,1,-1
 741 817 l 1,2,-1
 293 504 l 1,3,-1
 741 193 l 1,4,-1
 682 109 l 1,5,-1
 115 504 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: greater
Encoding: 62 62 84
Width: 856
VWidth: 0
Flags: W
HStem: 860 41G<145 233>
VStem: 115 627
LayerCount: 2
Fore
SplineSet
741 506 m 5,0,-1
 174 109 l 1,1,-1
 115 193 l 1,2,-1
 563 506 l 1,3,-1
 115 817 l 1,4,-1
 174 901 l 1,5,-1
 741 506 l 5,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: equal
Encoding: 61 61 85
Width: 708
VWidth: 0
Flags: W
HStem: 348 102<82 627> 573 102<82 627>
VStem: 82 545<348 451 573 676>
LayerCount: 2
Fore
SplineSet
82 676 m 1,0,-1
 627 676 l 1,1,-1
 627 573 l 1,2,-1
 82 573 l 1,3,-1
 82 676 l 1,0,-1
82 451 m 1,4,-1
 627 451 l 1,5,-1
 627 348 l 1,6,-1
 82 348 l 1,7,-1
 82 451 l 1,4,-1
EndSplineSet
Validated: 1
EndChar

StartChar: at
Encoding: 64 64 86
Width: 1331
VWidth: 0
Flags: W
HStem: -20 102<562 954> 262 102<878 998> 279 66<595 758> 860 66<596 734> 1126 102<518 854>
VStem: 82 174<390 840> 426 104<400 801> 766 102<399 837> 1051 174<518 923>
LayerCount: 2
Fore
SplineSet
872 745 m 1,0,1
 868 512 l 1,2,3
 868 426 868 426 882.5 395.5 c 128,-1,4
 897 365 897 365 926 365 c 0,5,6
 1051 365 1051 365 1051 723 c 0,7,8
 1051 816 1051 816 1019 895 c 128,-1,9
 987 974 987 974 937 1023 c 0,10,11
 832 1126 832 1126 727 1126 c 128,-1,12
 622 1126 622 1126 541 1093 c 128,-1,13
 460 1060 460 1060 395.5 998 c 128,-1,14
 331 936 331 936 293.5 836.5 c 128,-1,15
 256 737 256 737 256 621 c 128,-1,16
 256 505 256 505 289 413.5 c 128,-1,17
 322 322 322 322 374 262 c 0,18,19
 428 202 428 202 494 161 c 0,20,21
 619 82 619 82 752 82 c 0,22,23
 990 82 990 82 1108 264 c 1,24,-1
 1229 209 l 1,25,26
 1149 106 1149 106 1015.5 43 c 128,-1,27
 882 -20 882 -20 721 -20 c 0,28,29
 544 -20 544 -20 382 80 c 0,30,31
 196 194 196 194 123 384 c 0,32,33
 82 490 82 490 82 607 c 128,-1,34
 82 724 82 724 118.5 823.5 c 128,-1,35
 155 923 155 923 216 995.5 c 128,-1,36
 277 1068 277 1068 355 1122 c 0,37,38
 511 1229 511 1229 679 1229 c 0,39,-1
 682 1229 l 0,40,41
 926 1229 926 1229 1075.5 1092 c 128,-1,42
 1225 955 1225 955 1225 723 c 0,43,44
 1225 610 1225 610 1175.5 502 c 128,-1,45
 1126 394 1126 394 1049 328 c 128,-1,46
 972 262 972 262 901 262 c 128,-1,47
 830 262 830 262 801 319 c 1,48,49
 743 279 743 279 647 279 c 0,50,51
 426 279 426 279 426 614 c 0,52,53
 426 751 426 751 491 838.5 c 128,-1,54
 556 926 556 926 650.5 926 c 128,-1,55
 745 926 745 926 808.5 881 c 128,-1,56
 872 836 872 836 872 745 c 1,0,1
766 512 m 1,57,-1
 770 745 l 2,58,59
 770 783 770 783 739.5 821.5 c 128,-1,60
 709 860 709 860 676 860 c 0,61,62
 605 860 605 860 567.5 792.5 c 128,-1,63
 530 725 530 725 530 611.5 c 128,-1,64
 530 498 530 498 564 421 c 128,-1,65
 598 344 598 344 666 344 c 0,66,67
 710 344 710 344 731.5 355 c 128,-1,68
 753 366 753 366 774 397 c 1,69,70
 766 438 766 438 766 512 c 1,57,-1
EndSplineSet
Validated: 1
EndChar

StartChar: bracketleft
Encoding: 91 91 87
Width: 432
VWidth: 0
Flags: W
HStem: 0 82<205 340> 1270 82<205 340>
VStem: 92 248<0 82 1270 1352> 92 113<82 1270>
LayerCount: 2
Fore
SplineSet
340 0 m 1,0,-1
 92 0 l 1,1,-1
 92 1352 l 1,2,-1
 340 1352 l 1,3,-1
 340 1270 l 1,4,-1
 205 1270 l 1,5,-1
 205 82 l 1,6,-1
 340 82 l 1,7,-1
 340 0 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: bracketright
Encoding: 93 93 88
Width: 432
VWidth: 0
Flags: W
HStem: 0 82<92 227> 1270 82<92 227>
VStem: 92 248<0 82 1270 1352> 227 113<82 1270>
LayerCount: 2
Fore
SplineSet
92 1352 m 1,0,-1
 340 1352 l 1,1,-1
 340 0 l 1,2,-1
 92 0 l 1,3,-1
 92 82 l 1,4,-1
 227 82 l 1,5,-1
 227 1270 l 1,6,-1
 92 1270 l 1,7,-1
 92 1352 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: underscore
Encoding: 95 95 89
Width: 692
VWidth: 0
Flags: W
HStem: -184 102<0 692>
LayerCount: 2
Fore
SplineSet
0 -82 m 1,0,-1
 692 -82 l 1,1,-1
 692 -184 l 1,2,-1
 0 -184 l 1,3,-1
 0 -82 l 1,0,-1
EndSplineSet
Validated: 1
EndChar

StartChar: braceleft
Encoding: 123 123 90
Width: 530
VWidth: 0
Flags: W
HStem: 0 43G<208 449> 1393 41G<208 449>
VStem: 82 367
LayerCount: 2
Fore
SplineSet
346 1434 m 1,0,-1
 449 1434 l 1,1,2
 346 1358 346 1358 338 1155 c 0,3,4
 334 1072 334 1072 328 989 c 0,5,6
 314 792 314 792 184 717 c 1,7,8
 244 
Download .txt
gitextract_xch7c5aw/

├── .github/
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── ci.yaml
│       └── prebuild.yaml
├── .gitignore
├── CHANGELOG.md
├── Readme.md
├── benchmarks/
│   └── run.js
├── binding.gyp
├── browser.js
├── examples/
│   ├── clock.js
│   ├── crop.js
│   ├── fill-evenodd.js
│   ├── font.js
│   ├── globalAlpha.js
│   ├── gradients.js
│   ├── grayscale-image.js
│   ├── image-caption-overlay.js
│   ├── image-src-svg.js
│   ├── image-src-url.js
│   ├── image-src.js
│   ├── indexed-png-alpha.js
│   ├── indexed-png-image-data.js
│   ├── kraken.js
│   ├── live-clock.js
│   ├── multi-page-pdf.js
│   ├── pango-glyphs.js
│   ├── pdf-images.js
│   ├── pdf-link.js
│   ├── pfennigFont/
│   │   ├── FONTLOG.txt
│   │   ├── OFL.txt
│   │   ├── Pfennig.sfd
│   │   ├── PfennigBold.sfd
│   │   ├── PfennigBoldItalic.sfd
│   │   └── PfennigItalic.sfd
│   ├── ray.js
│   ├── resize.js
│   ├── rhill-voronoi-core-min.js
│   ├── small-pdf.js
│   ├── small-svg.js
│   ├── spark.js
│   ├── state.js
│   ├── text.js
│   └── voronoi.js
├── index.d.ts
├── index.js
├── index.test-d.ts
├── lib/
│   ├── DOMMatrix.js
│   ├── bindings.js
│   ├── canvas.js
│   ├── context2d.js
│   ├── image.js
│   ├── jpegstream.js
│   ├── pattern.js
│   ├── pdfstream.js
│   └── pngstream.js
├── package.json
├── src/
│   ├── Backends.h
│   ├── Canvas.cc
│   ├── Canvas.h
│   ├── CanvasError.h
│   ├── CanvasGradient.cc
│   ├── CanvasGradient.h
│   ├── CanvasPattern.cc
│   ├── CanvasPattern.h
│   ├── CanvasRenderingContext2d.cc
│   ├── CanvasRenderingContext2d.h
│   ├── CharData.h
│   ├── FontParser.cc
│   ├── FontParser.h
│   ├── Image.cc
│   ├── Image.h
│   ├── ImageData.cc
│   ├── ImageData.h
│   ├── InstanceData.h
│   ├── JPEGStream.h
│   ├── PNG.h
│   ├── Point.h
│   ├── Util.h
│   ├── bmp/
│   │   ├── BMPParser.cc
│   │   ├── BMPParser.h
│   │   └── LICENSE.md
│   ├── closure.cc
│   ├── closure.h
│   ├── color.cc
│   ├── color.h
│   ├── dll_visibility.h
│   ├── init.cc
│   ├── register_font.cc
│   └── register_font.h
├── test/
│   ├── canvas.test.js
│   ├── dommatrix.test.js
│   ├── fontParser.test.js
│   ├── image.test.js
│   ├── imageData.test.js
│   ├── public/
│   │   ├── app.html
│   │   ├── app.js
│   │   ├── style.css
│   │   └── tests.js
│   ├── server.js
│   └── wpt/
│       ├── drawing-text-to-the-canvas.yaml
│       ├── fill-and-stroke-styles.yaml
│       ├── generate.js
│       ├── generated/
│       │   ├── drawing-text-to-the-canvas.js
│       │   ├── line-styles.js
│       │   ├── meta.js
│       │   ├── path-objects.js
│       │   ├── pixel-manipulation.js
│       │   ├── shadows.js
│       │   ├── text-styles.js
│       │   ├── the-canvas-element.js
│       │   ├── the-canvas-state.js
│       │   └── transformations.js
│       ├── line-styles.yaml
│       ├── meta.yaml
│       ├── path-objects.yaml
│       ├── pixel-manipulation.yaml
│       ├── shadows.yaml
│       ├── text-styles.yaml
│       ├── the-canvas-element.yaml
│       ├── the-canvas-state.yaml
│       └── transformations.yaml
└── util/
    ├── has_lib.js
    └── win_jpeg_lookup.js
Download .txt
SYMBOL INDEX (535 symbols across 65 files)

FILE: benchmarks/run.js
  function bm (line 18) | function bm (label, fn) {
  function next (line 23) | function next () {
  function run (line 29) | function run (benchmark, n, start) {
  function done (line 48) | function done (benchmark, times, start, isAsync) {
  function fontName (line 67) | function fontName () {

FILE: browser.js
  function cleanup (line 21) | function cleanup () {

FILE: examples/clock.js
  function getX (line 5) | function getX (angle) {
  function getY (line 9) | function getY (angle) {
  function clock (line 13) | function clock (ctx) {

FILE: examples/font.js
  function fontFile (line 5) | function fontFile (name) {

FILE: examples/image-caption-overlay.js
  function createImageFromBuffer (line 8) | function createImageFromBuffer (buffer) {
  function createCaptionOverlay (line 15) | function createCaptionOverlay ({

FILE: examples/kraken.js
  function buildKernel (line 22) | function buildKernel () {
  function blurTest (line 54) | function blurTest () {

FILE: examples/multi-page-pdf.js
  function reset (line 9) | function reset () {
  function h1 (line 14) | function h1 (str) {
  function p (line 19) | function p (str) {

FILE: examples/pdf-images.js
  function reset (line 9) | function reset () {
  function h1 (line 14) | function h1 (str) {
  function p (line 19) | function p (str) {
  function img (line 24) | function img (src) {

FILE: examples/ray.js
  function render (line 8) | function render (level) {
  function renderLevel (line 14) | function renderLevel (minimumLevel, level, y) {
  function drawBlock (line 36) | function drawBlock (x, y, level) {
  function getPointColour (line 50) | function getPointColour (x, y) {

FILE: examples/rhill-voronoi-core-min.js
  function Voronoi (line 113) | function Voronoi(){this.sites=[];this.siteEvents=[];this.circEvents=[];t...

FILE: examples/spark.js
  function spark (line 8) | function spark (ctx, data) {

FILE: index.d.ts
  type PngConfig (line 5) | interface PngConfig {
  type JpegConfig (line 31) | interface JpegConfig {
  type PdfConfig (line 40) | interface PdfConfig {
  type NodeCanvasRenderingContext2DSettings (line 50) | interface NodeCanvasRenderingContext2DSettings {
  class Canvas (line 55) | class Canvas {
  type TextMetrics (line 130) | interface TextMetrics {
  type CanvasFillRule (line 143) | type CanvasFillRule = 'evenodd' | 'nonzero';
  type GlobalCompositeOperation (line 145) | type GlobalCompositeOperation =
  type CanvasLineCap (line 177) | type CanvasLineCap = 'butt' | 'round' | 'square';
  type CanvasLineJoin (line 179) | type CanvasLineJoin = 'bevel' | 'miter' | 'round';
  type CanvasTextBaseline (line 181) | type CanvasTextBaseline = 'alphabetic' | 'bottom' | 'hanging' | 'ideogra...
  type CanvasTextAlign (line 183) | type CanvasTextAlign = 'center' | 'end' | 'left' | 'right' | 'start';
  class CanvasRenderingContext2D (line 185) | class CanvasRenderingContext2D {
  class CanvasGradient (line 297) | class CanvasGradient {
  class CanvasPattern (line 301) | class CanvasPattern {
  class Image (line 307) | class Image {
  class PNGStream (line 396) | class PNGStream extends Readable {}
  class JPEGStream (line 398) | class JPEGStream extends Readable {}
  class PDFStream (line 400) | class PDFStream extends Readable {}
  type DOMMatrixInit (line 403) | type DOMMatrixInit = DOMMatrix | string | number[];
  type DOMPointInit (line 405) | interface DOMPointInit {
  class DOMPoint (line 412) | class DOMPoint {
  class DOMMatrix (line 422) | class DOMMatrix {
  class ImageData (line 486) | class ImageData {

FILE: index.js
  function createCanvas (line 15) | function createCanvas (width, height, type) {
  function createImageData (line 19) | function createImageData (array, width, height) {
  function loadImage (line 23) | function loadImage (src) {
  function registerFont (line 46) | function registerFont (src, fontFace) {
  function deregisterAllFonts (line 55) | function deregisterAllFonts () {

FILE: lib/DOMMatrix.js
  class DOMPoint (line 7) | class DOMPoint {
    method constructor (line 8) | constructor (x, y, z, w) {
    method matrixTransform (line 21) | matrixTransform(init) {
    method toJSON (line 28) | toJSON() {
    method fromPoint (line 37) | static fromPoint(other) {
  constant M11 (line 43) | const M11 = 0;
  constant M12 (line 43) | const M12 = 1;
  constant M13 (line 43) | const M13 = 2;
  constant M14 (line 43) | const M14 = 3
  constant M21 (line 44) | const M21 = 4;
  constant M22 (line 44) | const M22 = 5;
  constant M23 (line 44) | const M23 = 6;
  constant M24 (line 44) | const M24 = 7
  constant M31 (line 45) | const M31 = 8;
  constant M32 (line 45) | const M32 = 9;
  constant M33 (line 45) | const M33 = 10;
  constant M34 (line 45) | const M34 = 11
  constant M41 (line 46) | const M41 = 12;
  constant M42 (line 46) | const M42 = 13;
  constant M43 (line 46) | const M43 = 14;
  constant M44 (line 46) | const M44 = 15
  constant DEGREE_PER_RAD (line 48) | const DEGREE_PER_RAD = 180 / Math.PI
  constant RAD_PER_DEGREE (line 49) | const RAD_PER_DEGREE = Math.PI / 180
  function parseMatrix (line 51) | function parseMatrix (init) {
  function parseMatrix3d (line 64) | function parseMatrix3d (init) {
  function parseTransform (line 71) | function parseTransform (tform) {
  class DOMMatrix (line 84) | class DOMMatrix {
    method constructor (line 85) | constructor (init) {
    method toString (line 134) | toString () {
    method multiply (line 140) | multiply (other) {
    method multiplySelf (line 144) | multiplySelf (other) {
    method preMultiplySelf (line 150) | preMultiplySelf (other) {
    method translate (line 156) | translate (tx, ty, tz) {
    method translateSelf (line 160) | translateSelf (tx, ty, tz) {
    method scale (line 174) | scale (scaleX, scaleY, scaleZ, originX, originY, originZ) {
    method scale3d (line 178) | scale3d (scale, originX, originY, originZ) {
    method scale3dSelf (line 182) | scale3dSelf (scale, originX, originY, originZ) {
    method scaleNonUniform (line 189) | scaleNonUniform(scaleX, scaleY) {
    method scaleSelf (line 193) | scaleSelf (scaleX, scaleY, scaleZ, originX, originY, originZ) {
    method rotateFromVector (line 213) | rotateFromVector (x, y) {
    method rotateFromVectorSelf (line 217) | rotateFromVectorSelf (x, y) {
    method rotate (line 224) | rotate (rotX, rotY, rotZ) {
    method rotateSelf (line 228) | rotateSelf (rotX, rotY, rotZ) {
    method rotateAxisAngle (line 267) | rotateAxisAngle (x, y, z, angle) {
    method rotateAxisAngleSelf (line 271) | rotateAxisAngleSelf (x, y, z, angle) {
    method skewX (line 301) | skewX (sx) {
    method skewXSelf (line 305) | skewXSelf (sx) {
    method skewY (line 317) | skewY (sy) {
    method skewYSelf (line 321) | skewYSelf (sy) {
    method flipX (line 333) | flipX () {
    method flipY (line 342) | flipY () {
    method inverse (line 351) | inverse () {
    method invertSelf (line 355) | invertSelf () {
    method setMatrixValue (line 487) | setMatrixValue (transformList) {
    method transformPoint (line 494) | transformPoint (point) {
    method toFloat32Array (line 508) | toFloat32Array () {
    method toFloat64Array (line 512) | toFloat64Array () {
    method fromMatrix (line 516) | static fromMatrix (init) {
    method fromFloat32Array (line 521) | static fromFloat32Array (init) {
    method fromFloat64Array (line 526) | static fromFloat64Array (init) {
  method [util.inspect.custom || 'inspect'] (line 531) | [util.inspect.custom || 'inspect'] (depth, options) {
  function setNumber2D (line 565) | function setNumber2D (receiver, index, value) {
  function setNumber3D (line 574) | function setNumber3D (receiver, index, value) {
  method get (line 583) | get () { return this._values[M11] }
  method set (line 583) | set (v) { return setNumber2D(this, M11, v) }
  method get (line 584) | get () { return this._values[M12] }
  method set (line 584) | set (v) { return setNumber2D(this, M12, v) }
  method get (line 585) | get () { return this._values[M13] }
  method set (line 585) | set (v) { return setNumber3D(this, M13, v) }
  method get (line 586) | get () { return this._values[M14] }
  method set (line 586) | set (v) { return setNumber3D(this, M14, v) }
  method get (line 587) | get () { return this._values[M21] }
  method set (line 587) | set (v) { return setNumber2D(this, M21, v) }
  method get (line 588) | get () { return this._values[M22] }
  method set (line 588) | set (v) { return setNumber2D(this, M22, v) }
  method get (line 589) | get () { return this._values[M23] }
  method set (line 589) | set (v) { return setNumber3D(this, M23, v) }
  method get (line 590) | get () { return this._values[M24] }
  method set (line 590) | set (v) { return setNumber3D(this, M24, v) }
  method get (line 591) | get () { return this._values[M31] }
  method set (line 591) | set (v) { return setNumber3D(this, M31, v) }
  method get (line 592) | get () { return this._values[M32] }
  method set (line 592) | set (v) { return setNumber3D(this, M32, v) }
  method get (line 593) | get () { return this._values[M33] }
  method set (line 593) | set (v) { return setNumber3D(this, M33, v) }
  method get (line 594) | get () { return this._values[M34] }
  method set (line 594) | set (v) { return setNumber3D(this, M34, v) }
  method get (line 595) | get () { return this._values[M41] }
  method set (line 595) | set (v) { return setNumber2D(this, M41, v) }
  method get (line 596) | get () { return this._values[M42] }
  method set (line 596) | set (v) { return setNumber2D(this, M42, v) }
  method get (line 597) | get () { return this._values[M43] }
  method set (line 597) | set (v) { return setNumber3D(this, M43, v) }
  method get (line 598) | get () { return this._values[M44] }
  method set (line 598) | set (v) { return setNumber3D(this, M44, v) }
  method get (line 600) | get () { return this.m11 }
  method set (line 600) | set (v) { return (this.m11 = v) }
  method get (line 601) | get () { return this.m12 }
  method set (line 601) | set (v) { return (this.m12 = v) }
  method get (line 602) | get () { return this.m21 }
  method set (line 602) | set (v) { return (this.m21 = v) }
  method get (line 603) | get () { return this.m22 }
  method set (line 603) | set (v) { return (this.m22 = v) }
  method get (line 604) | get () { return this.m41 }
  method set (line 604) | set (v) { return (this.m41 = v) }
  method get (line 605) | get () { return this.m42 }
  method set (line 605) | set (v) { return (this.m42 = v) }
  method get (line 607) | get () { return this._is2D }
  method get (line 610) | get () {
  method value (line 620) | value() {
  function newInstance (line 656) | function newInstance (values) {
  function multiply (line 664) | function multiply (A, B) {

FILE: lib/canvas.js
  constant FORMATS (line 15) | const FORMATS = ['image/png', 'image/jpeg']

FILE: lib/image.js
  method set (line 30) | set (val) {
  method get (line 73) | get () {
  function getSource (line 90) | function getSource (img) {
  function setSource (line 94) | function setSource (img, src, origSrc) {

FILE: lib/jpegstream.js
  function noop (line 10) | function noop () {}
  class JPEGStream (line 12) | class JPEGStream extends Readable {
    method constructor (line 13) | constructor (canvas, options) {
    method _read (line 24) | _read () {

FILE: lib/pdfstream.js
  function noop (line 8) | function noop () {}
  class PDFStream (line 10) | class PDFStream extends Readable {
    method constructor (line 11) | constructor (canvas, options) {
    method _read (line 18) | _read () {

FILE: lib/pngstream.js
  function noop (line 10) | function noop () {}
  class PNGStream (line 12) | class PNGStream extends Readable {
    method constructor (line 13) | constructor (canvas, options) {
    method _read (line 25) | _read () {

FILE: src/Backends.h
  function class (line 6) | class Backends : public Napi::ObjectWrap<Backends> {

FILE: src/Canvas.cc
  function parsePNGArgs (line 236) | static void
  function parseJPEGArgs (line 280) | static void parseJPEGArgs(Napi::Value arg, JpegClosure& jpegargs) {
  function setPdfMetaStr (line 315) | static inline void setPdfMetaStr(cairo_surface_t* surf, Napi::Object opts,
  function setPdfMetaDate (line 324) | static inline void setPdfMetaDate(cairo_surface_t* surf, Napi::Object opts,
  function setPdfMetadata (line 335) | static void setPdfMetadata(Canvas* canvas, Napi::Object opts) {
  function cairo_status_t (line 516) | static cairo_status_t
  type PdfStreamInfo (line 556) | struct PdfStreamInfo {
  function cairo_status_t (line 566) | static cairo_status_t
  function cairo_status_t (line 581) | cairo_status_t canvas_write_to_pdf_stream(cairo_surface_t *surface, cair...
  function getSafeBufSize (line 643) | static uint32_t getSafeBufSize(Canvas* canvas) {
  function PangoStyle (line 800) | PangoStyle
  function PangoWeight (line 819) | PangoWeight
  function PangoFontDescription (line 855) | PangoFontDescription *
  function cairo_format_t (line 933) | cairo_format_t
  function cairo_surface_t (line 968) | cairo_surface_t *
  function cairo_t (line 1012) | cairo_t*

FILE: src/Canvas.h
  type Closure (line 5) | struct Closure
  type PdfSvgClosure (line 6) | struct PdfSvgClosure
  type canvas_type_t (line 20) | typedef enum {
  function class (line 31) | class FontFace {
  type text_baseline_t (line 38) | enum text_baseline_t : uint8_t {
  type text_align_t (line 47) | enum text_align_t : int8_t {
  type canvas_draw_mode_t (line 55) | enum canvas_draw_mode_t : uint8_t {
  function class (line 64) | class Canvas : public Napi::ObjectWrap<Canvas> {

FILE: src/CanvasError.h
  function class (line 6) | class CanvasError {
  function reset (line 18) | void reset() {
  function empty (line 24) | bool empty() {

FILE: src/CanvasGradient.h
  function class (line 8) | class Gradient : public Napi::ObjectWrap<Gradient> {

FILE: src/CanvasPattern.cc
  function repeat_type_t (line 118) | repeat_type_t Pattern::get_repeat_type_for_cairo_pattern(cairo_pattern_t...

FILE: src/CanvasPattern.h
  type repeat_type_t (line 12) | typedef enum {
  function class (line 21) | class Pattern : public Napi::ObjectWrap<Pattern> {

FILE: src/CanvasRenderingContext2d.cc
  function checkArgs (line 47) | inline static bool checkArgs(const Napi::CallbackInfo&info, double *args...
  function cairo_pattern_t (line 315) | cairo_pattern_t*
  function cairo_pattern_t (line 349) | cairo_pattern_t*
  function decompose_matrix (line 1272) | void decompose_matrix(cairo_matrix_t matrix, double *destination) {
  function parse_matrix_from_object (line 1895) | void parse_matrix_from_object(cairo_matrix_t &matrix, Napi::Object mat) {
  function get_text_scale (line 2485) | double
  function getBaselineAdjustment (line 2588) | inline double getBaselineAdjustment(PangoLayout* layout, short baseline) {
  function text_align_t (line 2608) | text_align_t
  function elli_arc (line 3058) | inline static
  function getRadius (line 3074) | inline static
  function canonicalizeAngle (line 3236) | static void canonicalizeAngle(double& startAngle, double& endAngle) {
  function adjustEndAngle (line 3252) | static double adjustEndAngle(double startAngle, double endAngle, bool co...

FILE: src/CanvasRenderingContext2d.h
  type float_rectangle (line 81) | typedef struct {
  function class (line 88) | class Context2d : public Napi::ObjectWrap<Context2d> {

FILE: src/CharData.h
  function namespace (line 8) | namespace CharData {

FILE: src/FontParser.cc
  function Token (line 68) | Token
  function Token (line 197) | Token
  function Token (line 276) | Token
  function Token (line 311) | Token
  function FontProperties (line 561) | FontProperties
  function FontProperties (line 569) | FontProperties

FILE: src/FontParser.h
  type class (line 11) | enum class
  type class (line 17) | enum class
  type FontProperties (line 22) | struct FontProperties {
  function FontStyle (line 27) | FontStyle fontStyle{FontStyle::Normal};
  type class (line 32) | enum class
  function std (line 50) | const std::string& getString() const;

FILE: src/Image.cc
  type canvas_jpeg_error_mgr (line 30) | struct canvas_jpeg_error_mgr: jpeg_error_mgr {
  function cairo_status_t (line 281) | cairo_status_t
  function cairo_status_t (line 338) | cairo_status_t
  function cairo_status_t (line 351) | cairo_status_t
  function cairo_status_t (line 371) | cairo_status_t
  function cairo_surface_t (line 398) | cairo_surface_t *Image::surface() {
  function cairo_status_t (line 425) | cairo_status_t
  function cairo_status_t (line 499) | cairo_status_t
  function get_gif_transparent_color (line 513) | int
  function read_gif_from_memory (line 529) | int
  function cairo_status_t (line 542) | cairo_status_t
  function cairo_status_t (line 575) | cairo_status_t
  function init_source (line 729) | static void
  function boolean (line 732) | static boolean
  function skip_input_data (line 737) | static void
  function term_source (line 746) | static void term_source (j_decompress_ptr cinfo) {}
  function jpeg_mem_src (line 747) | static void jpeg_mem_src (j_decompress_ptr cinfo, void* buffer, long nby...
  class BufferReader (line 768) | class BufferReader : public Image::Reader {
    method BufferReader (line 770) | BufferReader(uint8_t* buf, unsigned len) : _buf(buf), _len(len), _idx(...
    method hasBytes (line 772) | bool hasBytes(unsigned n) const override { return (_idx + n - 1 < _len...
    method getNext (line 774) | uint8_t getNext() override {
    method skipBytes (line 778) | void skipBytes(unsigned n) override { _idx += n; }
  class StreamReader (line 786) | class StreamReader : public Image::Reader {
    method StreamReader (line 788) | StreamReader(FILE *stream) : _stream(stream), _len(0), _idx(0) {
    method hasBytes (line 794) | bool hasBytes(unsigned n) const override { return (_idx + n - 1 < _len...
    method getNext (line 796) | uint8_t getNext() override {
    method skipBytes (line 801) | void skipBytes(unsigned n) override {
  function cairo_status_t (line 829) | cairo_status_t
  function canvas_jpeg_error_exit (line 914) | static void canvas_jpeg_error_exit(j_common_ptr cinfo) {
  function canvas_jpeg_output_message (line 922) | static void canvas_jpeg_output_message(j_common_ptr cinfo) {
  function cairo_status_t (line 935) | cairo_status_t
  function clearMimeData (line 1006) | void
  function cairo_status_t (line 1021) | cairo_status_t
  function cairo_status_t (line 1056) | cairo_status_t
  function cairo_status_t (line 1095) | cairo_status_t
  function cairo_status_t (line 1468) | cairo_status_t
  function cairo_status_t (line 1495) | cairo_status_t
  function cairo_status_t (line 1539) | cairo_status_t
  function cairo_status_t (line 1575) | cairo_status_t Image::loadBMPFromBuffer(uint8_t *buf, unsigned len){
  function cairo_status_t (line 1614) | cairo_status_t Image::loadBMP(FILE *stream){

FILE: src/Image.h
  function stride (line 57) | inline int stride(){ return cairo_image_surface_get_stride(_surface); }
  function isComplete (line 64) | inline int isComplete(){ return COMPLETE == state; }
  type Orientation (line 81) | enum Orientation {
  function class (line 98) | class Reader {
  type data_mode_t (line 121) | enum data_mode_t {
  type type (line 126) | typedef enum {

FILE: src/ImageData.h
  function class (line 8) | class ImageData : public Napi::ObjectWrap<ImageData> {

FILE: src/InstanceData.h
  type InstanceData (line 3) | struct InstanceData {

FILE: src/JPEGStream.h
  type closure_destination_mgr (line 12) | struct closure_destination_mgr {
  function init_closure_destination (line 19) | void
  function boolean (line 24) | boolean
  function term_closure_destination (line 42) | void
  function jpeg_closure_dest (line 58) | void
  function encode_jpeg (line 85) | void encode_jpeg(jpeg_compress_struct cinfo, cairo_surface_t *surface, i...
  function write_to_jpeg_stream (line 126) | void
  function write_to_jpeg_buffer (line 142) | void

FILE: src/PNG.h
  function canvas_png_flush (line 19) | static void canvas_png_flush(png_structp png_ptr) {
  function canvas_convert_data_to_bytes (line 25) | static void canvas_convert_data_to_bytes(png_structp png, png_row_infop ...
  function canvas_unpremultiply_data (line 42) | static void canvas_unpremultiply_data(png_structp png, png_row_infop row...
  function canvas_convert_565_to_888 (line 64) | static void canvas_convert_565_to_888(png_structp png, png_row_infop row...
  type canvas_png_write_closure_t (line 85) | struct canvas_png_write_closure_t {
  function setjmp_wrapper (line 91) | bool setjmp_wrapper(png_structp png) {
  function cairo_status_t (line 96) | static cairo_status_t canvas_write_png(cairo_surface_t *surface, png_rw_...
  function canvas_stream_write_func (line 266) | static void canvas_stream_write_func(png_structp png, png_bytep data, pn...
  function cairo_status_t (line 281) | static cairo_status_t canvas_write_to_png_stream(cairo_surface_t *surfac...

FILE: src/Util.h
  function streq_casein (line 5) | inline bool streq_casein(std::string& str1, std::string& str2) {

FILE: src/bmp/BMPParser.cc
  function Status (line 379) | Status Parser::getStatus() const{ return status; }
  function string (line 381) | string Parser::getErrMsg() const{
  function T (line 385) | inline T Parser::get(){
  function T (line 394) | inline T Parser::get(uint8_t* pointer){
  function string (line 401) | string Parser::getStr(int size, bool reverse){
  function string (line 439) | string Parser::getOp() const{
  function string (line 457) | string Parser::getErr() const{

FILE: src/bmp/BMPParser.h
  type Status (line 12) | enum Status{

FILE: src/closure.cc
  function boolean (line 12) | boolean JpegClosure::empty_output_buffer(j_compress_ptr cinfo) {

FILE: src/closure.h
  function catch (line 29) | struct Closure {
  function canvas (line 45) | canvas(canvas) {}
  function Closure (line 48) | struct PdfSvgClosure : Closure {
  function Closure (line 52) | struct PngClosure : Closure {
  function Closure (line 65) | struct JpegClosure : Closure {
  function class (line 88) | class EncodingWorker : public Napi::AsyncWorker {

FILE: src/color.cc
  function parse_integer (line 23) | static bool
  function parse_css_number (line 57) | static bool
  function T (line 128) | static T
  function T (line 142) | static T
  function parse_rgb_channel (line 160) | static bool
  function parse_degrees (line 175) | static bool
  function parse_clipped_percentage (line 189) | static bool
  function h (line 419) | static int
  function rgba_t (line 455) | rgba_t
  function rgba_to_string (line 469) | void
  function rgba_from_rgba (line 489) | static inline int32_t
  function hue_to_rgb (line 503) | static float
  function rgba_from_hsla (line 526) | static inline int32_t
  function rgba_from_hsl (line 550) | static inline int32_t
  function rgba_from_rgb (line 560) | static int32_t
  function rgba_from_hex8_string (line 569) | static int32_t
  function rgba_from_hex6_string (line 583) | static int32_t
  function rgba_from_hex4_string (line 596) | static int32_t
  function rgba_from_hex3_string (line 610) | static int32_t
  function rgba_from_rgb_string (line 623) | static int32_t
  function rgba_from_rgba_string (line 646) | static int32_t
  function rgba_from_hsla_string (line 670) | static int32_t
  function rgba_from_hsl_string (line 695) | static int32_t
  function rgba_from_hex_string (line 724) | static int32_t
  function rgba_from_name_string (line 741) | static int32_t
  function rgba_from_string (line 768) | int32_t
  function rgba_inspect (line 788) | void

FILE: src/color.h
  type rgba_t (line 12) | typedef struct {

FILE: src/init.cc
  function setDOMMatrix (line 32) | static void
  function setParseFont (line 38) | static void
  function init (line 49) | Napi::Object init(Napi::Env env, Napi::Object exports) {

FILE: src/register_font.cc
  function PangoWeight (line 127) | PangoWeight
  function PangoStretch (line 148) | PangoStretch
  function PangoStyle (line 164) | PangoStyle
  function u8ToWide (line 174) | std::unique_ptr<wchar_t[]>
  function stream_read_func (line 187) | static unsigned long
  function stream_close_func (line 201) | static void
  function register_font (line 291) | bool
  function deregister_font (line 325) | bool

FILE: test/canvas.test.js
  function assertApprox (line 23) | function assertApprox(actual, expected, tol) {
  function assertPixel (line 733) | function assertPixel (u32, x, y, message) {
  function createTestCanvas (line 1163) | function createTestCanvas (useAlpha, attributes) {
  function eachPixel (line 1925) | function eachPixel(bmp, func){
  function makeCheckerboard (line 1937) | function makeCheckerboard(w, h){
  function isCheckerboard (line 1947) | function isCheckerboard(ctx, w, h){
  function testAngle (line 2527) | function testAngle (angle, expected) {

FILE: test/dommatrix.test.js
  constant TOLERANCE (line 11) | const TOLERANCE = 0.001
  function assertApprox (line 12) | function assertApprox (actual, expected, tolerance) {
  function assertApproxDeep (line 17) | function assertApproxDeep (actual, expected, tolerance) {

FILE: test/image.test.js
  constant HAVE_SVG (line 14) | const HAVE_SVG = rsvgVersion !== undefined
  class MyError (line 103) | class MyError extends Error {}
  class MyError (line 114) | class MyError extends Error {}
  function withIncreasedByte (line 313) | function withIncreasedByte (source, index) {
  function testImgd (line 537) | function testImgd (img, data) {

FILE: test/public/app.js
  function create (line 3) | function create (type, attrs, children) {
  function pdfLink (line 13) | function pdfLink (name) {
  function localRendering (line 21) | function localRendering (name, callback) {
  function getDifference (line 38) | function getDifference (canvas, image, outputCanvas) {
  function clearTests (line 53) | function clearTests () {
  function runTests (line 58) | function runTests () {

FILE: test/public/tests.js
  function render (line 33) | function render (level) {
  function renderLevel (line 39) | function renderLevel (minimumLevel, level, y) {
  function drawBlock (line 60) | function drawBlock (x, y, level) {
  function getPointColour (line 74) | function getPointColour (x, y) {
  function drawSpirograph (line 363) | function drawSpirograph (ctx, R, r, O) {
  function drawSpirograph (line 435) | function drawSpirograph (ctx, R, r, O) {
  function drawStar (line 497) | function drawStar (ctx, r) {
  function drawWithBBox (line 2683) | function drawWithBBox (text, x, y) {

FILE: test/server.js
  function renderTest (line 10) | function renderTest (canvas, name, cb) {

FILE: test/wpt/generate.js
  constant SKIP_FILES (line 9) | const SKIP_FILES = new Set("meta.yaml");
  constant SKIP_TESTS (line 11) | const SKIP_TESTS = new Set([
  function expandNonfinite (line 23) | function expandNonfinite(method, argstr, tail) {
  function simpleEscapeJS (line 65) | function simpleEscapeJS(str) {
  function escapeJS (line 69) | function escapeJS(str) {
  function convert (line 76) | function convert(test) {

FILE: test/wpt/generated/drawing-text-to-the-canvas.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {
  function test_word_spacing (line 813) | function test_word_spacing(value) {
  function test_word_spacing (line 833) | function test_word_spacing(value) {
  function test_letter_spacing (line 855) | function test_letter_spacing(value, difference_spacing, epsilon) {
  function test_word_spacing (line 891) | function test_word_spacing(value, difference_spacing, epsilon) {

FILE: test/wpt/generated/line-styles.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {

FILE: test/wpt/generated/meta.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {

FILE: test/wpt/generated/path-objects.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {

FILE: test/wpt/generated/pixel-manipulation.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {
  function testDimensions (line 693) | function testDimensions(sx, sy, sw, sh, width, height)
  function setRGBA (line 798) | function setRGBA(imageData, i, rgba)
  function getRGBA (line 807) | function getRGBA(imageData, i)
  function assertArrayEquals (line 817) | function assertArrayEquals(actual, expected)

FILE: test/wpt/generated/shadows.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {

FILE: test/wpt/generated/text-styles.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {

FILE: test/wpt/generated/the-canvas-element.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {

FILE: test/wpt/generated/the-canvas-state.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {

FILE: test/wpt/generated/transformations.js
  method createElement (line 29) | createElement(type, ...args) {
  function _getPixel (line 36) | function _getPixel(canvas, x, y) {
  function _assertApprox (line 42) | function _assertApprox(actual, expected, epsilon=0, msg="") {
  function _assertPixel (line 55) | function _assertPixel(canvas, x, y, r, g, b, a, pos, color) {
  function _assertPixelApprox (line 63) | function _assertPixelApprox(canvas, x, y, r, g, b, a, pos, color, tolera...
  function assert_throws_js (line 71) | function assert_throws_js(Type, fn) {
  function deferTest (line 76) | function deferTest() {}
  class Test (line 78) | class Test {
    method done (line 80) | done() {}
    method step_func_done (line 82) | step_func_done(func) { func(); }
    method step_func (line 84) | step_func(func) { func(); }
  function step_timeout (line 87) | function step_timeout(result, time) {

FILE: util/has_lib.js
  constant SYSTEM_PATHS (line 5) | const SYSTEM_PATHS = [
  function hasSystemLib (line 25) | function hasSystemLib (lib) {
  function hasLdconfig (line 57) | function hasLdconfig () {
  function hasFreetype (line 75) | function hasFreetype () {
  function hasPkgconfigLib (line 91) | function hasPkgconfigLib (lib) {
  function main (line 101) | function main (query) {

FILE: util/win_jpeg_lookup.js
  function exists (line 15) | function exists (path) {
Condensed preview — 124 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,574K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 595,
    "preview": "## Issue or Feature\n- [ ] If this is an issue with installation, I have read the [troubleshooting guide](https://github."
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 63,
    "preview": "Thanks for contributing!\n\n- [ ] Have you updated CHANGELOG.md?\n"
  },
  {
    "path": ".github/workflows/ci.yaml",
    "chars": 2707,
    "preview": "name: Test\non:\n  push:\n    paths-ignore:\n      - \".github/workflows/prebuild.yaml\"\n  pull_request:\n    paths-ignore:\n   "
  },
  {
    "path": ".github/workflows/prebuild.yaml",
    "chars": 308,
    "preview": "# This is a dummy file so that this workflow shows up in the Actions tab.\n# Prebuilds are actually run using the prebuil"
  },
  {
    "path": ".gitignore",
    "chars": 208,
    "preview": "build\n.DS_Store\n.lock-wscript\ntest/images/*.png\nexamples/*.png\nexamples/*.jpg\nexamples/*.pdf\ntesting\nout.png\nout.pdf\nout"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 39501,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": "Readme.md",
    "chars": 28353,
    "preview": "# node-canvas\n\n![Test](https://github.com/Automattic/node-canvas/workflows/Test/badge.svg)\n[![NPM version](https://badge"
  },
  {
    "path": "benchmarks/run.js",
    "chars": 4626,
    "preview": "/**\n * Adaptive benchmarking. Starts with `initialTimes` iterations, increasing by\n * a power of two each time until the"
  },
  {
    "path": "binding.gyp",
    "chars": 7285,
    "preview": "{\n  'conditions': [\n    ['OS==\"win\"', {\n      'variables': {\n        'GTK_Root%': 'C:/GTK',  # Set the location of GTK a"
  },
  {
    "path": "browser.js",
    "chars": 986,
    "preview": "/* globals document, ImageData */\n\nexports.createCanvas = function (width, height) {\n  return Object.assign(document.cre"
  },
  {
    "path": "examples/clock.js",
    "chars": 2510,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nfunction getX (angle) {\n  return -Ma"
  },
  {
    "path": "examples/crop.js",
    "chars": 603,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('canvas')\n\nconst img = new Canvas.Image()\n\n"
  },
  {
    "path": "examples/fill-evenodd.js",
    "chars": 366,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(1"
  },
  {
    "path": "examples/font.js",
    "chars": 1326,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nfunction fontFile (name) {\n  return "
  },
  {
    "path": "examples/globalAlpha.js",
    "chars": 693,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(1"
  },
  {
    "path": "examples/gradients.js",
    "chars": 781,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(3"
  },
  {
    "path": "examples/grayscale-image.js",
    "chars": 475,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst Image = Canvas.Image\nconst can"
  },
  {
    "path": "examples/image-caption-overlay.js",
    "chars": 2214,
    "preview": "import { createWriteStream } from 'fs'\nimport pify from 'pify'\nimport imageSizeOf from 'image-size'\nimport { createCanva"
  },
  {
    "path": "examples/image-src-svg.js",
    "chars": 587,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(5"
  },
  {
    "path": "examples/image-src-url.js",
    "chars": 454,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst Image = Canvas.Image\nconst can"
  },
  {
    "path": "examples/image-src.js",
    "chars": 994,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst Image = Canvas.Image\nconst can"
  },
  {
    "path": "examples/indexed-png-alpha.js",
    "chars": 1025,
    "preview": "const Canvas = require('..')\r\nconst fs = require('fs')\r\nconst path = require('path')\r\nconst canvas = Canvas.createCanvas"
  },
  {
    "path": "examples/indexed-png-image-data.js",
    "chars": 1130,
    "preview": "const Canvas = require('..')\r\nconst fs = require('fs')\r\nconst path = require('path')\r\nconst canvas = Canvas.createCanvas"
  },
  {
    "path": "examples/kraken.js",
    "chars": 2618,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst Image = Canvas.Image\nconst can"
  },
  {
    "path": "examples/live-clock.js",
    "chars": 474,
    "preview": "const http = require('http')\nconst Canvas = require('..')\n\nconst clock = require('./clock')\n\nconst canvas = Canvas.creat"
  },
  {
    "path": "examples/multi-page-pdf.js",
    "chars": 721,
    "preview": "const fs = require('fs')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(500, 500, 'pdf')\nconst ctx = c"
  },
  {
    "path": "examples/pango-glyphs.js",
    "chars": 724,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(4"
  },
  {
    "path": "examples/pdf-images.js",
    "chars": 1120,
    "preview": "const fs = require('fs')\nconst { Image, createCanvas } = require('..')\n\nconst canvas = createCanvas(500, 500, 'pdf')\ncon"
  },
  {
    "path": "examples/pdf-link.js",
    "chars": 601,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(4"
  },
  {
    "path": "examples/pfennigFont/FONTLOG.txt",
    "chars": 4665,
    "preview": "FONTLOG\nPfennig font family\n==========================\n\nThis file provides detailed information on the Pfennig family of"
  },
  {
    "path": "examples/pfennigFont/OFL.txt",
    "chars": 4374,
    "preview": "Copyright (c) 2009 - 2012 Daniel Johnson (<il.basso.buffo@gmail.com>).\n\nThis Font Software is licensed under the SIL Ope"
  },
  {
    "path": "examples/pfennigFont/Pfennig.sfd",
    "chars": 678521,
    "preview": "SplineFontDB: 3.0\nFontName: Pfennig\nFullName: Pfennig\nFamilyName: Pfennig\nWeight: Medium\nCopyright: Copyright 2009-2012 "
  },
  {
    "path": "examples/pfennigFont/PfennigBold.sfd",
    "chars": 750694,
    "preview": "SplineFontDB: 3.0\nFontName: PfennigBold\nFullName: Pfennig Bold\nFamilyName: Pfennig\nWeight: Bold\nCopyright: Copyright 200"
  },
  {
    "path": "examples/pfennigFont/PfennigBoldItalic.sfd",
    "chars": 726721,
    "preview": "SplineFontDB: 3.0\nFontName: PfennigBoldItalic\nFullName: Pfennig Bold Italic\nFamilyName: Pfennig\nWeight: Bold\nCopyright: "
  },
  {
    "path": "examples/pfennigFont/PfennigItalic.sfd",
    "chars": 746268,
    "preview": "SplineFontDB: 3.0\nFontName: PfennigItalic\nFullName: Pfennig Italic\nFamilyName: Pfennig\nWeight: Medium\nCopyright: Copyrig"
  },
  {
    "path": "examples/ray.js",
    "chars": 1895,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(2"
  },
  {
    "path": "examples/resize.js",
    "chars": 735,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst Image = Canvas.Image\n\nconst im"
  },
  {
    "path": "examples/rhill-voronoi-core-min.js",
    "chars": 18556,
    "preview": "/* eslint-disable */\n/*!\nA custom Javascript implementation of Steven J. Fortune's algorithm to\ncompute Voronoi diagrams"
  },
  {
    "path": "examples/small-pdf.js",
    "chars": 581,
    "preview": "const fs = require('fs')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(400, 200, 'pdf')\nconst ctx = c"
  },
  {
    "path": "examples/small-svg.js",
    "chars": 581,
    "preview": "const fs = require('fs')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(400, 200, 'svg')\nconst ctx = c"
  },
  {
    "path": "examples/spark.js",
    "chars": 801,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(4"
  },
  {
    "path": "examples/state.js",
    "chars": 895,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(1"
  },
  {
    "path": "examples/text.js",
    "chars": 919,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(2"
  },
  {
    "path": "examples/voronoi.js",
    "chars": 3631,
    "preview": "const http = require('http')\nconst Canvas = require('..')\n\nconst canvas = Canvas.createCanvas(1920, 1200)\nconst ctx = ca"
  },
  {
    "path": "index.d.ts",
    "chars": 18492,
    "preview": "// TypeScript Version: 3.0\n\nimport { Readable } from 'stream'\n\nexport interface PngConfig {\n\t/** Specifies the ZLIB comp"
  },
  {
    "path": "index.js",
    "chars": 2891,
    "preview": "const Canvas = require('./lib/canvas')\nconst Image = require('./lib/image')\nconst CanvasRenderingContext2D = require('./"
  },
  {
    "path": "index.test-d.ts",
    "chars": 1575,
    "preview": "import { expectAssignable, expectType } from 'tsd'\nimport * as path from 'path'\nimport { Readable } from 'stream'\n\nimpor"
  },
  {
    "path": "lib/DOMMatrix.js",
    "chars": 19713,
    "preview": "'use strict'\n\nconst util = require('util')\n\n// DOMMatrix per https://drafts.fxtf.org/geometry/#DOMMatrix\n\nclass DOMPoint"
  },
  {
    "path": "lib/bindings.js",
    "chars": 1062,
    "preview": "'use strict'\n\nconst bindings = require('../build/Release/canvas.node')\n\nmodule.exports = bindings\n\nObject.defineProperty"
  },
  {
    "path": "lib/canvas.js",
    "chars": 3264,
    "preview": "'use strict'\n\n/*!\n * Canvas\n * Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n * MIT Licensed\n */\n\nconst bindings = r"
  },
  {
    "path": "lib/context2d.js",
    "chars": 205,
    "preview": "'use strict'\n\n/*!\n * Canvas - Context2d\n * Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n * MIT Licensed\n */\n\nconst "
  },
  {
    "path": "lib/image.js",
    "chars": 2647,
    "preview": "'use strict'\n\n/*!\n * Canvas - Image\n * Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n * MIT Licensed\n */\n\n/**\n * Mod"
  },
  {
    "path": "lib/jpegstream.js",
    "chars": 874,
    "preview": "'use strict'\n\n/*!\n * Canvas - JPEGStream\n * Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n * MIT Licensed\n */\n\nconst"
  },
  {
    "path": "lib/pattern.js",
    "chars": 292,
    "preview": "'use strict'\n\n/*!\n * Canvas - CanvasPattern\n * Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n * MIT Licensed\n */\n\nco"
  },
  {
    "path": "lib/pdfstream.js",
    "chars": 679,
    "preview": "'use strict'\n\n/*!\n * Canvas - PDFStream\n */\n\nconst { Readable } = require('stream')\nfunction noop () {}\n\nclass PDFStream"
  },
  {
    "path": "lib/pngstream.js",
    "chars": 940,
    "preview": "'use strict'\n\n/*!\n * Canvas - PNGStream\n * Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n * MIT Licensed\n */\n\nconst "
  },
  {
    "path": "package.json",
    "chars": 1771,
    "preview": "{\n  \"name\": \"canvas\",\n  \"description\": \"Canvas graphics API backed by Cairo\",\n  \"version\": \"3.2.3\",\n  \"author\": \"TJ Holo"
  },
  {
    "path": "src/Backends.h",
    "chars": 193,
    "preview": "#pragma once\n\n#include \"backend/Backend.h\"\n#include <napi.h>\n\nclass Backends : public Napi::ObjectWrap<Backends> {\n  pub"
  },
  {
    "path": "src/Canvas.cc",
    "chars": 31345,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#include \"Canvas.h\"\n#include \"InstanceData.h\"\n#include <algorithm>"
  },
  {
    "path": "src/Canvas.h",
    "chars": 3793,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#pragma once\n\nstruct Closure;\nstruct PdfSvgClosure;\n\n#include \"clo"
  },
  {
    "path": "src/CanvasError.h",
    "chars": 977,
    "preview": "#pragma once\n\n#include <string>\n#include <napi.h>\n\nclass CanvasError {\n  public:\n    std::string message;\n    std::strin"
  },
  {
    "path": "src/CanvasGradient.cc",
    "chars": 2832,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#include \"CanvasGradient.h\"\n#include \"InstanceData.h\"\n\n#include \"C"
  },
  {
    "path": "src/CanvasGradient.h",
    "chars": 477,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#pragma once\n\n#include <napi.h>\n#include <cairo.h>\n\nclass Gradient"
  },
  {
    "path": "src/CanvasPattern.cc",
    "chars": 3707,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#include \"CanvasPattern.h\"\n\n#include \"Canvas.h\"\n#include \"Image.h\""
  },
  {
    "path": "src/CanvasPattern.h",
    "chars": 866,
    "preview": "// Copyright (c) 2011 LearnBoost <tj@learnboost.com>\n\n#pragma once\n\n#include <cairo.h>\n#include <napi.h>\n\n/*\n * Canvas t"
  },
  {
    "path": "src/CanvasRenderingContext2d.cc",
    "chars": 103047,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#include \"CanvasRenderingContext2d.h\"\n\n#include <algorithm>\n#inclu"
  },
  {
    "path": "src/CanvasRenderingContext2d.h",
    "chars": 10672,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#pragma once\n\n#include \"cairo.h\"\n#include \"Canvas.h\"\n#include \"col"
  },
  {
    "path": "src/CharData.h",
    "chars": 14124,
    "preview": "// This is used for classifying characters according to the definition of tokens\n// in the CSS standards, but could be e"
  },
  {
    "path": "src/FontParser.cc",
    "chars": 14474,
    "preview": "// This is written to exactly parse the `font` shorthand in CSS2:\n// https://www.w3.org/TR/CSS22/fonts.html#font-shortha"
  },
  {
    "path": "src/FontParser.h",
    "chars": 2515,
    "preview": "#pragma once\n\n#include <string>\n#include <vector>\n#include <optional>\n#include <memory>\n#include <variant>\n#include <uno"
  },
  {
    "path": "src/Image.cc",
    "chars": 44918,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#include \"Image.h\"\n#include \"InstanceData.h\"\n\n#include \"bmp/BMPPar"
  },
  {
    "path": "src/Image.h",
    "chars": 4729,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#pragma once\n\n#include <cairo.h>\n#include \"CanvasError.h\"\n#include"
  },
  {
    "path": "src/ImageData.cc",
    "chars": 4156,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#include \"ImageData.h\"\n#include \"InstanceData.h\"\n\n/*\n * Initialize"
  },
  {
    "path": "src/ImageData.h",
    "chars": 707,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#pragma once\n\n#include <napi.h>\n#include <stdint.h> // node < 7 us"
  },
  {
    "path": "src/InstanceData.h",
    "chars": 370,
    "preview": "#include <napi.h>\n\nstruct InstanceData {\n  Napi::FunctionReference CanvasCtor;\n  Napi::FunctionReference CanvasGradientC"
  },
  {
    "path": "src/JPEGStream.h",
    "chars": 4614,
    "preview": "#pragma once\n\n#include \"closure.h\"\n#include <jpeglib.h>\n#include <jerror.h>\n\n/*\n * Expanded data destination object for "
  },
  {
    "path": "src/PNG.h",
    "chars": 9422,
    "preview": "#pragma once\n\n#include <cairo.h>\n#include \"closure.h\"\n#include <cmath> // round\n#include <cstdlib>\n#include <cstring>\n#i"
  },
  {
    "path": "src/Point.h",
    "chars": 248,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n#pragma once\n\ntemplate <typename T>\nclass Point {\n  public:\n    T x"
  },
  {
    "path": "src/Util.h",
    "chars": 282,
    "preview": "#pragma once\n\n#include <cctype>\n\ninline bool streq_casein(std::string& str1, std::string& str2) {\n  return str1.size() ="
  },
  {
    "path": "src/bmp/BMPParser.cc",
    "chars": 12922,
    "preview": "#include \"BMPParser.h\"\r\n\r\n#include <cassert>\r\n#include <cstring>\r\n\r\nusing namespace std;\r\nusing namespace BMPParser;\r\n\r\n"
  },
  {
    "path": "src/bmp/BMPParser.h",
    "chars": 1424,
    "preview": "#pragma once\r\n\r\n#ifdef ERROR\r\n#define ERROR_ ERROR\r\n#undef ERROR\r\n#endif\r\n\r\n#include <stdint.h> // node < 7 uses libstdc"
  },
  {
    "path": "src/bmp/LICENSE.md",
    "chars": 1232,
    "preview": "This is free and unencumbered software released into the public domain.\r\n\r\nAnyone is free to copy, modify, publish, use,"
  },
  {
    "path": "src/closure.cc",
    "chars": 1577,
    "preview": "#include \"closure.h\"\n#include \"Canvas.h\"\n\n#ifdef HAVE_JPEG\nvoid JpegClosure::init_destination(j_compress_ptr cinfo) {\n  "
  },
  {
    "path": "src/closure.h",
    "chars": 2424,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#pragma once\n\nclass Canvas;\n#include <cairo.h>\n\n#include \"Canvas.h"
  },
  {
    "path": "src/color.cc",
    "chars": 17596,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#include \"color.h\"\n\n#include <algorithm>\n#include <cmath>\n#include"
  },
  {
    "path": "src/color.h",
    "chars": 449,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#pragma once\n\n#include <stdint.h> // node < 7 uses libstdc++ on ma"
  },
  {
    "path": "src/dll_visibility.h",
    "chars": 420,
    "preview": "#ifndef DLL_PUBLIC\n\n#if defined _WIN32\n  #ifdef __GNUC__\n    #define DLL_PUBLIC __attribute__ ((dllexport))\n  #else\n    "
  },
  {
    "path": "src/init.cc",
    "chars": 3281,
    "preview": "// Copyright (c) 2010 LearnBoost <tj@learnboost.com>\n\n#include <cstdio>\n#include <pango/pango.h>\n\n#include <cairo.h>\n#if"
  },
  {
    "path": "src/register_font.cc",
    "chars": 9840,
    "preview": "#include \"register_font.h\"\n\n#include <pango/pangocairo.h>\n#include <pango/pango-fontmap.h>\n#include <pango/pango.h>\n\n#if"
  },
  {
    "path": "src/register_font.h",
    "chars": 207,
    "preview": "#pragma once\n\n#include <pango/pango.h>\n\nPangoFontDescription *get_pango_font_description(unsigned char *filepath);\nbool "
  },
  {
    "path": "test/canvas.test.js",
    "chars": 90078,
    "preview": "/* eslint-env mocha */\n\n'use strict'\n\n/**\n * Module dependencies.\n */\nconst assert = require('assert')\nconst os = requir"
  },
  {
    "path": "test/dommatrix.test.js",
    "chars": 19159,
    "preview": "/* eslint-env mocha */\n\n'use stricit'\n\nconst {DOMMatrix} = require('../')\n\nconst assert = require('assert')\n\n// This doe"
  },
  {
    "path": "test/fontParser.test.js",
    "chars": 3879,
    "preview": "/* eslint-env mocha */\n\n'use strict'\n\n/**\n * Module dependencies.\n */\nconst assert = require('assert')\nconst {Canvas} = "
  },
  {
    "path": "test/image.test.js",
    "chars": 14805,
    "preview": "/* eslint-env mocha */\n\n'use strict'\n\n/**\n * Module dependencies.\n */\nconst assert = require('assert')\nconst assertRejec"
  },
  {
    "path": "test/imageData.test.js",
    "chars": 2983,
    "preview": "/* eslint-env mocha */\n\n'use strict'\n\nconst {createImageData} = require('../')\nconst {ImageData} = require('../')\n\nconst"
  },
  {
    "path": "test/public/app.html",
    "chars": 472,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>node-canvas</title>\n    <link href=\"/style.css\" rel=\"stylesheet\">\n  </head>\n "
  },
  {
    "path": "test/public/app.js",
    "chars": 2768,
    "preview": "window.addEventListener('load', runTests)\n\nfunction create (type, attrs, children) {\n  const element = Object.assign(doc"
  },
  {
    "path": "test/public/style.css",
    "chars": 557,
    "preview": "body {\n  padding: 40px 50px;\n  font: 13px/1.4 \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\np {\n  margin: 15px 5px;"
  },
  {
    "path": "test/public/tests.js",
    "chars": 69754,
    "preview": "let DOMMatrix\nlet Image\nlet imageSrc\nconst tests = {}\n\n/* global btoa */\n\nif (typeof module !== 'undefined' && module.ex"
  },
  {
    "path": "test/server.js",
    "chars": 1626,
    "preview": "const path = require('path')\nconst express = require('express')\n\nconst Canvas = require('../')\nconst tests = require('./"
  },
  {
    "path": "test/wpt/drawing-text-to-the-canvas.yaml",
    "chars": 35248,
    "preview": "- name: 2d.text.draw.fill.basic\n  desc: fillText draws filled text\n  manual:\n  testing:\n  - 2d.text.draw\n  - 2d.text.dra"
  },
  {
    "path": "test/wpt/fill-and-stroke-styles.yaml",
    "chars": 66281,
    "preview": "- name: 2d.fillStyle.parse.current.basic\n  desc: currentColor is computed from the canvas element\n  testing:\n  - 2d.colo"
  },
  {
    "path": "test/wpt/generate.js",
    "chars": 7393,
    "preview": "// This file is a port of gentestutils.py from\n// https://github.com/web-platform-tests/wpt/tree/master/html/canvas/tool"
  },
  {
    "path": "test/wpt/generated/drawing-text-to-the-canvas.js",
    "chars": 44531,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/generated/line-styles.js",
    "chars": 31017,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/generated/meta.js",
    "chars": 2726,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/generated/path-objects.js",
    "chars": 139527,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/generated/pixel-manipulation.js",
    "chars": 67152,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/generated/shadows.js",
    "chars": 35500,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/generated/text-styles.js",
    "chars": 21148,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/generated/the-canvas-element.js",
    "chars": 11115,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/generated/the-canvas-state.js",
    "chars": 5774,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/generated/transformations.js",
    "chars": 23172,
    "preview": "// THIS FILE WAS AUTO-GENERATED. DO NOT EDIT BY HAND.\n\nconst assert = require('assert');\nconst path = require('path');\n\n"
  },
  {
    "path": "test/wpt/line-styles.yaml",
    "chars": 24782,
    "preview": "- name: 2d.line.defaults\n  testing:\n  - 2d.lineWidth.default\n  - 2d.lineCap.default\n  - 2d.lineJoin.default\n  - 2d.miter"
  },
  {
    "path": "test/wpt/meta.yaml",
    "chars": 23716,
    "preview": "- meta: |\n    cases = [\n        (\"zero\", \"0\", 0),\n        (\"empty\", \"\", None),\n        (\"onlyspace\", \"  \", None),\n      "
  },
  {
    "path": "test/wpt/path-objects.yaml",
    "chars": 105483,
    "preview": "- name: 2d.path.initial\n  testing:\n  - 2d.path.initial\n  #mozilla: { bug: TODO }\n  code: |\n    ctx.fillStyle = '#0f0';\n "
  },
  {
    "path": "test/wpt/pixel-manipulation.yaml",
    "chars": 39079,
    "preview": "- name: 2d.imageData.create2.basic\n  desc: createImageData(sw, sh) exists and returns something\n  testing:\n  - 2d.imageD"
  },
  {
    "path": "test/wpt/shadows.yaml",
    "chars": 30855,
    "preview": "- name: 2d.shadow.attributes.shadowBlur.initial\n  testing:\n  - 2d.shadow.blur.get\n  - 2d.shadow.blur.initial\n  code: |\n "
  },
  {
    "path": "test/wpt/text-styles.yaml",
    "chars": 15069,
    "preview": "- name: 2d.text.font.parse.basic\n  testing:\n  - 2d.text.font.parse\n  - 2d.text.font.get\n  code: |\n    ctx.font = '20px s"
  },
  {
    "path": "test/wpt/the-canvas-element.yaml",
    "chars": 5574,
    "preview": "- name: 2d.getcontext.exists\n  desc: The 2D context is implemented\n  testing:\n  - context.2d\n  code: |\n    @assert canva"
  },
  {
    "path": "test/wpt/the-canvas-state.yaml",
    "chars": 2556,
    "preview": "- name: 2d.state.saverestore.transformation\n  desc: save()/restore() affects the current transformation matrix\n  testing"
  },
  {
    "path": "test/wpt/transformations.yaml",
    "chars": 11346,
    "preview": "- name: 2d.transformation.order\n  desc: Transformations are applied in the right order\n  testing:\n  - 2d.transformation."
  },
  {
    "path": "util/has_lib.js",
    "chars": 2855,
    "preview": "const query = process.argv[2]\nconst fs = require('fs')\nconst childProcess = require('child_process')\n\nconst SYSTEM_PATHS"
  },
  {
    "path": "util/win_jpeg_lookup.js",
    "chars": 360,
    "preview": "const fs = require('fs')\nconst paths = ['C:/libjpeg-turbo']\n\nif (process.arch === 'x64') {\n  paths.unshift('C:/libjpeg-t"
  }
]

About this extraction

This page contains the full source code of the LearnBoost/node-canvas GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 124 files (4.2 MB), approximately 1.1M tokens, and a symbol index with 535 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!