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

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.37.0] - 2022-09-07

### Added
 - Paragraph has new setting: `replaceTabCharacters`.
 - New API, tests and sample for SkParagraph Client provided ICU API:
   - buildWithClientInfo
   - getText

### Fixed
 - readPixels calls could sometimes fail due to a stale internal reference to GrDirectContext.

## [0.36.1] - 2022-08-22

### Changed
 - Perspective text is enabled.

### Fixed
 - Text is no longer distorted on certain Adreno GPUs (http://review.skia.org/571418)

## [0.36.0] - 2022-08-16

### Added
 - The following path methods: `addCircle`, `CanInterpolate`, and `MakeFromPathInterpolation`.
 - The following ImageFilter factory methods: `MakeBlend`, `MakeDilate`, `MakeDisplacementMap`,
   `MakeDropShadow`, `MakeDropShadowOnly`, `MakeErode`, `MakeImage`, `MakeOffset`, and `MakeShader`.
 - The `MakeLuma` ColorFilter factory method.
 - The `fontVariations` TextStyle property.
 - `ColorFilter.MakeBlend` supports float colors under the hood and takes an optional colorspace.

### Changed
 - Updated `dtslint`, `typescript`, and `@webgpu/types` versions, used for testing index.d.ts types.

### Fixed
 - `Image.readPixels` should work on `Image`s created with `MakeLazyImageFromTextureSource`
   (https://github.com/flutter/flutter/issues/103803)

### Known Issues
 - `ImageFilter.MakeDisplacementMap` is not behaving as expected in certain circumstances.

## [0.35.0] - 2022-06-30

### Fixed
 - Minor bug fixes in the TypeScript type declaration.
 - Creating a Premul Image from a TextureSource should upload the texture to WebGL correctly.

### Added
 - `Surface.makeImageFromTextureSource`, `Surface.updateTextureFromSource`, and
   `MakeLazyImageFromTextureSource` all take an optional `srcIsPremul` to specify if their source
   data has Premultiplied alpha. This avoids double multiplying alpha in certain cases.
 - WebGPU support. Introduced `CanvasKit.MakeGPUDeviceContext`, `CanvasKit.MakeGPUCanvasContext`,
   `CanvasKit.MakeGPUCanvasSurface`, and `CanvasKit.MakeGPUTextureSurface` which are compatible with
   WebGPU `GPUDevice` and `GPUTexture` objects.
 - Typescript definitions for WebGPU API functions that are compatible with `@webgpu/types`
   (https://www.npmjs.com/package/@webgpu/types).
 - `CanvasKit.MakeCanvasSurface` is now deprecated. Clients should specify a backend target
   explicitly using `CanvasKit.MakeSWCanvasSurface`, `CanvasKit.MakeOnScreenGLSurface`,
   `CanvasKit.MakeGPUCanvasSurface`, and `CanvasKit.MakeGPUTextureSurface`.
 - `CanvasKit.MakeGrContext` is now deprecated. Clients should use `CanvasKit.MakeWebGLContext` and
   `CanvasKit.MakeGPUDeviceContext` instead.

## [0.34.1] - 2022-06-02

### Added
 - `Canvas.getDeviceClipBounds` (skbug.com/13347)

### Fixed
 - `RuntimeEffect.makeShader` and `RuntimeEffect.makeShaderWithChildren` can properly accept
   uniform data as MallocObj or derived TypedArrays without incorrectly freeing the uniform data.

## [0.34.0] - 2022-05-05

### Breaking
 - `SkRuntimeEffect.makeShader` and `SkRuntimeEffect.makeShaderWithChildren` no longer accept
   an `isOpaque` parameter. These functions will now make a best effort to determine if your
   shader always produces opaque output, and optimize accordingly. If you definitely want your
   shader to produce opaque output, do so in the shader's SkSL code.

### Added
 - `SkPicture.makeShader`
 - Skia now has a GN toolchain that is used to compile CanvasKit. Ideally, all settings should
   be the same, but there may be some subtle differences in practice. This changes the setup
   to build CanvasKit (users no longer need to download emsdk themselves).

### Changed
 - If an invalid matrix type is passed in (e.g. not an array, TypedArray, or DOMMatrix), CanvasKit
   will throw instead of drawing incorrectly.

### Fixed
 - SkParagraph objects no longer have their glyphs garbled when stored to an SkPicture.
   (skbug.com/13247)

## [0.33.0] - 2022-02-03

### Added
 - `Surface.updateTextureFromSource` prevents flickering on some platforms by re-using the texture
   for a given `Image` instead of needing to always create a new one via
   `Surface.makeImageFromTextureSource`. (skbug.com/12723)
 - `ParagraphBuilder.reset` allows re-use of the underlying memory.
 - `PathEffect.MakePath2D`, `PathEffect.MakePath1D` and `PathEffect.MakeLine2D`.

### Changed
 - Surface factories always produce a surface with an attached color space. Specifying `null` to
   `CanvasKit.MakeWebGLCanvasSurface` or calling any factory that does not take a color space
   will now create a surface with a color space of `CanvasKit.ColorSpace.SRGB`.
 - We now build/ship with emscripten 3.1.3.
 - Internal calls no longer use dynamic dispatch (skbug.com/12795).
 - JPEG and WEBP encoding are turned on by default in full version (in /bin/full/).

### Fixed
 - Supplying textures via `Surface.makeImageFromTextureSource` should not cause issues with
   Mipmaps or other places where Skia needs to create textures (skbug.com/12797)
 - `CanvasKit.MakeRenderTarget` correctly takes 2 or 3 params, as per the documentation.
 - `CanvasKit.MakeOnScreenGLSurface` and other gpu surface constructors correctly adjust the
   underlying WebGL context, avoiding corruption and mismatched textures
   (https://github.com/flutter/flutter/issues/95259).

## [0.32.0] - 2021-12-15

### Breaking
 - `Canvas.drawVertices` and `Canvas.drawPatch` treat the default blend mode differently.
   See https://bugs.chromium.org/p/skia/issues/detail?id=12662.
 - `Canvas.markCTM` and `Canvas.findMarkedCTM` have been removed. They were effectively no-ops.

### Added
 - Rough implementation of `measureText` to Canvas2D emulation layer. For accurate numbers, clients
   should use a real shaping library, like SkParagraph.
 - `AnimatedImage.currentFrameDuration` has been added, as well as some clarifying documentation.

### Fixed
 - Drawing images created from MakeLazyImageFromTextureSource should no longer cause a draw to only
   partially show up on some frames <https://crbug.com/skia/12740>.

## [0.31.0] - 2021-11-16

### Added
 - `CanvasKit.MakeLazyImageFromTextureSource`, which is similar to
   `Surface.makeImageFromTextureSource`, but can be re-used across different WebGL contexts.

### Breaking
 - `Surface.makeImageFromTextureSource` now takes an optional ImageInfo or PartialImageInfo
   instead of optional width and height. Sensible defaults will be used if not supplied.

### Fixed
 - Some `Surface` methods would not properly switch to the right WebGL context.
 - Warnings about `INVALID_ENUM: enable: invalid capability` should be reduced/eliminated.

### Removed
 - `FontMgr.MakeTypefaceFromData` and `FontMgr.RefDefault` have been removed in favor of
   `Typeface.MakeFreeTypeFaceFromData`

### Changed
 - `make release`, `make debug`, and variants put the output in a different location (./build).
 - Example .html files load CanvasKit from the new location (./build).

### Type Changes (index.d.ts)
 - `Surface.requestAnimationFrame` and `Surface.drawOnce` are properly documented.
 - Fixed typo in TextStyle (decrationStyle => decorationStyle)

## [0.30.0] - 2021-09-15

### Removed
 - `Surface.grContext` and `Surface.openGLversion` - these had been undocumented and are no longer
   exposed.
 - `CanvasKit.setCurrentContext` and `CanvasKit.currentContext`. Existing calls can be deleted.

### Changed
 - CanvasKit APIs now handle switching between WebGL contexts automatically.
 - Reduced overhead when switching between WebGL contexts.

### Type Changes (index.d.ts)
 - `Canvas.drawImage*` calls are correctly documented as accepting an optional `Paint` or null.

## [0.29.0] - 2021-08-06

### Added
 - `Path.makeAsWinding` has been added to convert paths with an EvenOdd FillType to the
   equivalent area using the Winding FillType.

### Breaking
 - `Paint.getBlendMode()` has been removed.
 - `Canvas.drawImageAtCurrentFrame()` has been removed.
 - FilterQuality enum removed -- pass `FilterOptions` | `CubicResampler` instead.

### Type Changes (index.d.ts)
 - Replaced all `object` with actual types, including `AnimationMarker`.

## [0.28.1] - 2021-06-28

### Added
 - `Typeface.MakeFreeTypeFaceFromData` as a more convenient way to create a Typeface from the bytes
   of a .ttf, .woff, or .woff2 file.
 - `Typeface.getGlyphIDs` - provides the same functionality as `Font.getGlyphIDs`.

### Changed
 - ICU has been updated from v65 to v69.
 - Freetype has been updated from f9350be to ff40776.

### Fixed
 - We should no longer have to decode the same font multiple times (skbug.com/12112)
 - `Font.getGlyphIDs` had the wrong type for the third argument. It is now correctly a Uint16Array.

### Deprecated
 - `FontMgr.MakeTypefaceFromData` will be removed in favor of `Typeface.MakeFreeTypeFaceFromData`
 - `FontMgr.RefDefault` will be removed in an upcoming version. It's only real use was
   for `FontMgr.MakeTypefaceFromData`.

## [0.28.0] - 2021-06-17

### Added
 - `Surface.makeImageFromTexture` and `Surface.makeImageFromTextureSource` as easy ways to provide
   CanvasKit with a WebGL texture and interact with WebGL texture sources (e.g. &lt;video&gt;)

### Changed
 - We now build/ship with emscripten 2.0.20.

### Breaking
 - `Path.toCmds()` returns a flattened Float32Array instead of a 2D Array.
 - `Canvaskit.Path.MakeFromCmds` no longer accepts a 2D Array. Inputs must be flattened,
   but can be an array, a TypedArray, or a MallocObj.
 - `CanvasKit.*Builder` have all been removed. Clients should use Malloc instead.

### Removed
 - `CanvasKit.Shader.MakeLerp`, the same effect can be easily generated with `RuntimeEffect`

### Known Bugs
 - On legacy (non-ANGLE) SwiftShader, certain paths that require tessellation may not be drawn
   correctly when using a WebGL-backed surface. (skbug.com/11965)

## [0.27.0] - 2021-05-20

### Added
 - `Font.getGlyphIntercepts()`
 
### Fixed
 - Bug with images using certain exif metadata. (skbug.com/11968)

### Removed
 - `Canvas.flush`, which had been previously deprecated. `Surface.flush` is the preferred method.
 - `AnimatedImage.getCurrentFrame`, which had been previously deprecated.
   `AnimatedImage.makeImageAtCurrentFrame` is the replacement, which behaves exactly the same.

## [0.26.0] - 2021-04-23

### Added
 - Add 'isEmbolden, setEmbolden' to 'Font'
 - Add 'drawGlyphs' to 'Canvas'
 - Add `drawPatch` to `Canvas`.
 - Add `Strut` as a `RectHeightStyle` enum.
 - `CanvasKit.RuntimeEffect` now supports integer uniforms in the SkSL. These are still passed
   to `RuntimeEffect.makeShader` as floats (like all other uniforms), and will be converted to
   integers internally, to match the expectations of the shader.
 - Add 'halfLeading' to `TextStyle` and `StrutStyle`.
 - `ParagraphStyle` now accepts textHeightBehavior.

### Removed
 - `Picture.saveAsFile()`, in favor of `Picture.serialize()` where clients can control how to
    store/encode the bytes.

## [0.25.1] - 2021-03-30

### Added
 - Skottie accessors for dynamic text properties (text string, font size).
 - Optional sampling parameter to drawAtlas (paint filter-quality is ignored/deprecated)

### Fixed
 - Fonts should not be leaked https://bugs.chromium.org/p/skia/issues/detail?id=11778

## [0.25.0] - 2021-03-02

### Added
 - A full build of CanvasKit is now in /bin/full.
 - `CanvasKit.rt_effect` to test if the RuntimeEffect code was compiled in.

### Breaking
 - The `ShapedText` type has been removed. Clients who want ShapedText should use the
   Paragraph APIs.

### Removed
 - `Font.measureText`, which had been previously deprecated. Clients should use either
   Paragraph APIs or `Font.getGlyphWidths` instead (the latter does no shaping).
 - `Font.getWidths`, which had been previously deprecated. Clients should use `Font.getGlyphWidths`.

### Type Changes (index.d.ts)
 - Documentation added for `managed_skottie`, `particles`, and `skottie` feature constants.

## [0.24.0] - 2021-02-18

### Added
 - The Skottie factory (MakeManagedAnimation) now accepts an optional logger object.

### Breaking
 - `CanvasKit.getDataBytes` has been removed, as has the Data type. The 2 APIS that returned
   Data now return Uint8Array containing the bytes directly. These are `Image.encodeToData`
   (now named `Image.encodeToBytes`) and `SkPicture.serialize`. These APIs return null if
   the encoding or serialization failed.

### Type Changes (index.d.ts)
 - `Image.encodeToDataWithFormat` was incorrectly documented as its own thing.

## [0.23.0] - 2021-02-04

### Added
 - Constants for the shadow flags. Of note, some of these values can be used on previous releases.
 - `getShadowLocalBounds()` to estimate the bounds of the shadows drawn by `Canvas.drawShadow`.
 - compile.sh now takes "no_matrix", which will omit the helper JS to deal with 3x3, 4x4 and
   SkColorMatrix (in case clients have logic to deal with that themselves).
 - `CanvasKit.RuntimeEffect.Make` now takes an optional callback function that will be called
   with any compilation error.
 - `CanvasKit.RuntimeEffect` now exposes uniforms. The number, dimensions, and name of each
   uniform can be queried, using `RuntimeEffect.getUniformCount`, `RuntimeEffect.getUniform`, and
   `RuntimeEffect.getUniformName`. The total number of floats across all uniforms (that must be
   passed to `RuntimeEffect.makeShader`) can be queried with `RuntimeEffect.getUniformFloatCount`.

### Breaking
 - `MakeImprovedNoise` is removed.
 - Particles now use a single code string containing both Effect and Particle code. Uniform APIs are
   now shared between Effect and Particle programs, and are no longer prefixed with `Effect` or
   `Particle`. For example, instead of `ParticleEffect.getEffectUniform` and
   `ParticleEffect.getParticleUniform`, there is now just: `ParticleEffect.getUniform`.

### Changed
 - `Path.getPoint()` and `SkottieAnimation.size()` now return a TypedArray instead of a normal
   array. Additionally, they take an optional parameter to allow the result to be copied into
   that provided TypedArray instead of a new one being allocated.
 - APIs that passed in points should have less overhead (and now can accept a TypedArray).
 - `Canvas.drawShadow()` now accepts zPlaneParams and lightPos as Malloc'ed and regular
   Float32Arrays. `getShadowLocalBounds()` does as well.
 - `ContourMeasure.getPosTan` returns a Float32Array instead of a normal array. Additionally,
   this method takes an optional parameter to allow the result to be copied into
   that provided Float32Array instead of a new one being allocated.

### Fixed
 - Improper error returned when a WebGL context could not be used.
 - 4x4 matrices are "downsampled" properly if necessary to 3x3 matrices by removing the third
   column and the third row.
 - `SkottieAnimation.size()` was incorrectly returning an object. It now returns a TypedArray of
   length 2 (w, h).

### Deprecated
 - `Canvas.drawImageRect`, `Canvas.drawImage`, `Canvas.drawAtlas`,
   These rely on the Paint's FilterQuality, which is going away. Pass sampling options explicitly.

### Removed
 - `PathMeasure`, which was deprecated and replaced with `ContourMeasure`.

## [0.22.0] - 2020-12-17

### Added
 - `Canvas.drawImageCubic`, `Canvas.drawImageOptions`, `Canvas.drawImageRectCubic`,
   `Canvas.drawImageRectOptions` to replace functionality that previously required FilterQuality.
 - A copy of this changelog is published in NPM releases for easier discovery.

### Breaking
 - `Canvas.drawImageNine` now takes a required FilterMode (the Paint still is optional).

## [0.21.0] - 2020-12-16

### Added
 - `getImageInfo()` and `getColorSpace()` to the `Image` type.
 - `CanvasKit.deleteContext()` for deleting WebGL contexts when done with them, resizing, etc.
 - `Image.makeCopyWithDefaultMipmaps()` for use with `Image.makeShaderOptions`; necessary if
   choosing a `MipmapMode` that is not `None`.

### Breaking
 - `Path.addPoly()` no longer accepts a 2d array of points, but a flattened 1d array.
 - `MakeVertices()` no longer accepts 2d arrays of points or texture coordinates, but
   flattened 1d arrays in both places.
 - `Paint.setFilterQuality`, `Paint.getFilterQuality`, `Image.makeShader` have been removed.
   The new way to specify interpolation settings is with the newly added `Image.makeShader*`
   methods. `Image.makeShaderCubic` is a replacement for high quality; `Image.makeShaderOptions`
   is for medium/low.

### Changed
 - `MakeImage` is now documented in the Typescript types (index.d.ts). The parameters have been
   streamlined to align with other, similar APIs.
 - `MakeAnimatedImageFromEncoded` respects Exif metadata. `MakeImageFromEncoded` already did so
   (and continues to do so).
 - The Canvas2D emulation layer always uses high quality image smoothing (this drastically
   simplifies the underlying code).
 - We now compile CanvasKit with emsdk 2.0.10 when testing and deploying to npm.
 - Instead of shipping a "core" build to npm, we ship a "profiling" build, which is the same as
   the main build, just with unmangled function calls and other debugging info useful for
   determining where runtime is spent.

### Fixed
 - `Canvas.drawPoints` correctly takes a flattened Array or TypedArray of points (as the
   documentation says), not a 2D array.

### Type Changes (index.d.ts)
 - Documented additional type for InputFlexibleColorArray.

## [0.20.0] - 2020-11-12

### Added
 - `MakeFractalNoise`, `MakeImprovedNoise`, and `MakeTurbulence` have been added to
   `CanvasKit.Shader`.
 - `MakeRasterDirectSurface` for giving the user direct access to drawn pixels.
 - `getLineMetrics` to Paragraph.
 - `Canvas.saveLayerPaint` as an experimental, undocumented "fast path" if one only needs to pass 
   the paint.
 - Support for .woff and .woff2 fonts. Disable .woff2 for reduced code size by supplying
   no_woff2 to compile.sh. (This removes the code to do brotli decompression).

### Breaking
 - `CanvasKit.MakePathFromSVGString` was renamed to `CanvasKit.Path.MakeFromSVGString`
 - `CanvasKit.MakePathFromOp` was renamed to `CanvasKit.Path.MakeFromOp`
 - The API for `Canvas.readPixels` and `Image.readPixels` has been reworked to more accurately
   reflect the C++ backend and each other. bytesPerRow is now a required parameter. They take an
   ImageInfo object to specify the output format. Additionally they take an optional malloc'd
   object as the last parameter. If provided, the data will be copied into there instead of
   allocating a new buffer.

### Changed
 - We now compile CanvasKit with emsdk 2.0.6 when testing and deploying to npm.
 - We no longer compile with rtti on, saving about 1% in code size.
 - `CanvasKit.Shader.Blend`, `...Color`, and `...Lerp` have been renamed to
   `CanvasKit.Shader.MakeBlend`, `...MakeColor` and `...MakeLerp` to align with naming conventions.
   The old names will be removed in an upcoming release.

### Removed
 - `CanvasKit.MakePathFromCmds`; Was deprecated in favor of `CanvasKit.Path.MakeFromCmds`.
 - `new CanvasKit.Path(path)` in favor of existing `path.copy()`.
 - Unused internal APIs (_getRasterN32PremulSurface, Drawable)
 - `measureText` from the CanvasContext2D emulation layer due to deprecation of measureText.

### Deprecated
 - `Font.getWidths` in favor of `Font.getGlyphIDs` and `Font.getGlyphWidths`.
 - `Font.measureText` in favor of the Paragraph APIs (which actually do shaping).

### Type Changes (index.d.ts)
 - Return value for MakeFromCmds correctly reflects the possibility of null.
 - `CanvasKit.GrContext` was renamed to `CanvasKit.GrDirectContext`.
 - Add docs/types for Shader Gradients (e.g. `CanvasKit.Shader.MakeLinearGradient`).

## [0.19.0] - 2020-10-08

### Breaking
 - "Sk" has been removed from all names. e.g. `new CanvasKit.SkPaint()` becomes
   `new CanvasKit.Paint()`. See `./types/index.d.ts` for all the new names.

### Removed
 - `Surface.captureFrameAsSkPicture`; it was deprecated previously.
 - `CanvasKit.MakeSkCornerPathEffect`, `CanvasKit.MakeSkDiscretePathEffect`,
   `CanvasKit.MakeBlurMaskFilter`, `CanvasKit.MakeSkDashPathEffect`,
   `CanvasKit.MakeLinearGradientShader`, `CanvasKit.MakeRadialGradientShader`,
   `CanvasKit.MakeTwoPointConicalGradientShader`;  these were deprecated previously and have
   replacements like `CanvasKit.PathEffect.MakeDash`.
 - `Canvas.concat44`; it was deprecated previously, just use `Canvas.concat`

## [0.18.1] - 2020-10-06

### Added
 - Typescript types (and documentation) are now in the types subfolder. We will keep these updated
   as we make changes to the CanvasKit library.

## [0.18.0] - 2020-10-05

### Breaking
 - SkRect are no longer returned from `CanvasKit.LTRBRect`, `CanvasKit.XYWHRect` nor
   are accepted as JS objects. Instead, the format is 4 floats in either an array, a
   Float32Array or a piece of memory returned by CanvasKit.Malloc. These floats are the
   left, top, right, bottom numbers of the rectangle.
 - SkIRect (Rectangles with Integer values) are no longer accepted as JS objects.
   Instead, the format is 4 ints in either an array, an Int32Array or a piece of memory
   returned by CanvasKit.Malloc. These ints are the left, top, right, bottom numbers of
   the rectangle.
 - SkRRect (Rectangles with rounded corners) are no longer returned from `CanvasKit.RRectXY`
   nor are accepted as JS objects. Instead, the format is 12 floats in either an array, a
   Float32Array or a piece of memory returned by CanvasKit.Malloc. The first 4 floats
   are the left, top, right, bottom numbers of the rectangle and then 4 sets of points
   starting in the upper left corner and going clockwise. This change allows for faster
   transfer between JS and WASM code.
 - `SkPath.addRoundRect` has been replaced with `SkPath.addRRect`. The same functionality
   can be had with the `CanvasKit.RRectXY` helper.
 - `SkPath.addRect` no longer accepts 4 floats as separate arguments. It only accepts
   an SkRect (an array/Float32Array of 4 floats) and an optional boolean for
   determining clockwise or counter-clockwise directionality.
 - The order of `SkCanvas.saveLayer` arguments is slightly different (more consistent).
   It is now `paint, bounds, backdrop, flags`

### Changed
 - We now compile CanvasKit with emsdk 2.0.0 when testing and deploying to npm.
 - WebGL interface creation is a little leaner in terms of code size and speed.
 - The signature of `main` used with SkSL passed to `CanvasKit.SkRuntimeEffect.Make` has changed.
   There is no longer an `inout half4 color` parameter, effects must return their color instead.
   Valid signatures are now `half4 main()` or `half4 main(float2 coord)`.
 - `SkPath.getBounds`, `SkShapedText.getBounds`, and `SkVertices.bounds` now
   take an optional argument. If a Float32Array with length 4 or greater is
   provided, the bounds will be copied into this array instead of allocating
   a new one.
 - `SkCanvas.drawAnimatedImage` has been removed in favor of calling
   `SkCanvas.drawImageAtCurrentFrame` or `SkAnimatedImage.makeImageAtCurrentFrame` and then
   `SkCanvas.drawImage`.
 - `SkTextBlob.MakeFromRSXform` also accepts a (possibly Malloc'd) Float32Array of RSXforms (
   see SkRSXform for more.)

### Removed
 - `SkCanvas.drawRoundRect` has been removed in favor of `SkCanvas.drawRRect`
   The same functionality can be had with the `CanvasKit.RRectXY` helper.
 - `SkPath.arcTo` which had been deprecated in favor of `SkPath.arcToOval`,
   `SkPath.arcToRotated`, `SkPath.arcToTangent`.
 - Extraneous ColorTypes from `ColorType` enum.

### Added
 - `CanvasKit.LTRBiRect` and `CanvasKit.XYWHiRect` as helpers to create SkIRects.
 - `SkCanvas.drawRect4f` as a somewhat experimental way to have array-free APIs for clients that
   already have their own representation of Rect. This is experimental because we don't know
   if it's faster/better under real-world use and because we don't want to commit to having these
   for all Rect APIs (and for similar types) until it has baked in a bit.
 - Added the following to `TextStyle`:
   - `decorationStyle`
   - `textBaseline`
   - `letterSpacing`
   - `wordSpacing`
   - `heightMultiplier`
   - `locale`
   - `shadows`
   - `fontFeatures`
 - Added `strutStyle` to `ParagraphStyle`.
 - Added `addPlaceholder` to `ParagraphBuilder`.
 - Added `getRectsForPlaceholders` to `Paragraph`.
 - `SkFont.getGlyphIDs`, `SkFont.getGlyphBounds`, `SkFont.getGlyphWidths` for turning code points
   into GlyphIDs and getting the associated metrics with those glyphs. Note: glyph ids are only
   valid for the font of which they were requested.
 - `SkTextBlob.MakeFromRSXformGlyphs` and `SkTextBlob.MakeFromGlyphs` as a way to build TextBlobs
   using GlyphIDs instead of code points.
 - `CanvasKit.MallocGlyphIDs` as a helper for pre-allocating space on the WASM heap for Glyph IDs.

### Deprecated
 - `SkAnimatedImage.getCurrentFrame`; prefer `SkAnimatedImage.makeImageAtCurrentFrame` (which
   follows the establishing naming convention).
 - `SkSurface.captureFrameAsSkPicture` will be removed in a future release. Callers can simply
   use `SkPictureRecorder` directly.
 - `CanvasKit.FourFloatArrayHelper` and related helpers (mostly helping with drawAtlas).
   `CanvasKit.Malloc` is the better tool and will replace these soon.
 - `SkPathMeasure`; SkContourMeasureIter has all the same functionality and a cleaner pattern.

### Fixed
 - Addressed Memory leak in `SkCanvas.drawText`.
 - Made SkTextBlob hang on to less memory during its lifetime.
 - `SkPath.computeTightBounds()` works again. Like getBounds() it takes an optional argument
   to put the bounds into.

## [0.17.3] - 2020-08-05

### Added
 - Added `CanvasKit.TypefaceFontProvider`, which can be used to register fonts
   with a font family alias. For example, "Roboto Light" may be registered with
   the alias "Roboto", and it will be used when "Roboto" is used with a light
   font weight.
 - Added `CanvasKit.ParagraphBuilder.MakeFromFontProvider` to make a
   `ParagraphBuilder` from a `TypefaceFontProvider`.
 - Added `CanvasKit.ParagraphBuilder.pushPaintStyle` which can be used to stroke or fill
   text with paints instead of simple colors.

## [0.17.2] - 2020-07-22

### Fixed
 - Shader programs are no longer generated with `do-while` loops in WebGL 1.0.

## [0.17.1] - 2020-07-21

### Added
 - Compile option to deserialize effects in skps `include_effects_deserialization`.

### Changed
 - Pathops and SKP deserialization/serialization enabled on the npm build.

## [0.17.0] - 2020-07-20

### Added
 - Added `CanvasKit.MakeImageFromCanvasImageSource` which takes either an HTMLImageElement,
   SVGImageElement, HTMLVideoElement, HTMLCanvasElement, ImageBitmap, or OffscreenCanvas and returns
   an SkImage. This function is an alternative to `CanvasKit.MakeImageFromEncoded` for creating
   SkImages when loading and decoding images. In the future, codesize of CanvasKit may be able to be
   reduced by removing image codecs in wasm, if browser APIs for decoding images are used along with
   `CanvasKit.MakeImageFromCanvasImageSource` instead of `CanvasKit.MakeImageFromEncoded`.
 - Three usage examples of `CanvasKit.MakeImageFromCanvasImageSource` in core.spec.ts.
 - Added support for asynchronous callbacks in perfs and tests.
 - `CanvasKit.SkPath.MakeFromVerbsPointsWeights` and `CanvasKit.SkPath.addVerbsPointsWeights` for
  supplying many path operations (e.g. moveTo, cubicTo) at once.
 - The object returned by `CanvasKit.malloc` now has a `subarray` method which works exactly like
  the normal TypedArray version. The TypedArray which it returns is also backed by WASM memory
  and when passed into CanvasKit will be used w/o copying the data (just like
  `Malloc.toTypedArray`).
 - `SkM44.setupCamera` to return a 4x4 matrix which sets up a perspective view from a camera.
 - `SkPath.arcToOval`, `SkPath.arcToTangent`, and `SkPath.arcToRotated` to replace the three
   overloads of `SkPath.arcTo`. https://github.com/flutter/flutter/issues/61305

### Changed
 - In all places where color arrays are accepted (gradient makers, drawAtlas, and MakeSkVertices),
   You can now provide either flat Float32Arrays of float colors, Uint32Arrays of int colors, or
   2d Arrays of Float32Array(4) colors. The one thing you should not pass is an Array of numbers,
   since canvaskit wouldn't be able to tell whether they're ints or floats without checking them all.
   The fastest choice for gradients is the flat Float32Array, the fastest choice for drawAtlas and
   MakeSkVertices is the flat Uint32Array.
 - Color arrays may also be objects created with CanvasKit.Malloc
 - renamed `reportBackendType` to `reportBackendTypeIsGPU` and made it return a boolean
 - `MakeWebGLCanvasSurface` can now accept an optional dictionary of WebGL context attributes that
   can be used to override default attributes.

### Fixed
 - `TextStyle.color` can correctly be a Malloc'd Float32Array.
 - Support wombat-dressing-room. go/npm-publish

### Deprecated
 - `CanvasKit.MakePathFromCmds` has been renamed to `CanvasKit.SkPath.MakeFromCmds`. The alias
   will be removed in an upcoming release.
 - `SkPath.arcTo` Separated into three functions.

## [0.16.2] - 2020-06-05

### Fixed
 - A bug where loading fonts (and other memory intensive calls) would cause CanvasKit
   to infrequently crash with
   `TypeError: Cannot perform %TypedArray%.prototype.set on a neutered ArrayBuffer`.
 - Incorrectly freeing Malloced colors passed into computeTonalColors.

## [0.16.1] - 2020-06-04

### Fixed
 - Colors are unsigned to be compatible with Flutter Web and previous behavior, not
   signed ints.

## [0.16.0] - 2020-06-03

### Added
 - Support for wide-gamut color spaces DisplayP3 and AdobeRGB. However, correct representation on a
   WCG monitor requires that the browser is rendering everything to the DisplayP3 or AdobeRGB
   profile, since there is not yet any way to indicate to the browser that a canvas element has a
   non-sRGB color space. See color support example in extra.html. Only supported for WebGL2 backed
   surfaces.
 - Added `SkSurface.reportBackendType` which returns either 'CPU' or 'GPU'.
 - Added `SkSurface.imageInfo` which returns an ImageInfo object describing the size and color
   properties of the surface. colorSpace is added to ImageInfo everywhere it is used.
 - `CanvasKit.Free` to explicitly clean up memory after `CanvasKit.Malloc`. All memory allocated
   with `CanvasKit.Malloc` must be released with `CanvasKit.Free` or it will be leaked. This can
   improve performance by reducing the copying of data between the JS and WASM side.
 - `CanvasKit.ColorAsInt`, `SkPaint.setColorComponents`, `SkPaint.setColorInt`,
   `SkCanvas.drawColorComponents`, `SkCanvas.drawColorInt` for when clients want
   to avoid the overhead of allocating an array for color components and only need 8888 color.

### Changed
 - We now compile/ship with Emscripten v1.39.16.
 - `CanvasKit.MakeCanvasSurface` accepts a new enum specifying one of the three color space and
   pixel format combinations supported by CanvasKit.
 - all `_Make*Shader` functions now accept a color space argument at the end. leaving it off or
   passing null makes it behave as it did before, defaulting to sRGB
 - `SkPaint.setColor` accepts a new color space argument, defaulting to sRGB.
 - Fewer allocations required to send Color and Matrices between JS and WASM layer.
 - All APIs that take a 1 dimensional array should also accept the object returned by Malloc. It is
   recommended to pass the Malloc object, as the TypedArray could be invalidated any time
   CanvasKit needs to allocate memory and needs to resize to accommodate.

### Breaking
 - `CanvasKitInit(...)` now directly returns a Promise. As such, `CanvasKitInit(...).ready()`
   has been removed.
 - `CanvasKit.MakeCanvasSurface` no longer accepts width/height arguments to override those on
   the canvas element. Use the canvas element's width/height attributes to dictate the size of
   the drawing area, and use CSS width/height to set the size it will appear on the page
   (it is rescaled after drawing when css sizing applies).
 - Memory returned by `CanvasKit.Malloc` will no longer be automatically cleaned up. Clients
   must use `CanvasKit.Free` to release the memory.
 - `CanvasKit.Malloc` no longer directly returns a TypedArray, but an object that can produce
   them with toTypedArray(). This is to avoid "detached ArrayBuffer" errors:
   <https://github.com/emscripten-core/emscripten/issues/6747>

### Fixed
 - WebGL context is no longer created with "antialias" flag. Using "antialias" caused poor AA
   quality in Ganesh when trying to do coverage-based AA with MSAA unknowingly enabled. It also
   reduced performance.

## [0.15.0] - 2020-05-14

### Added
 - Support for DOMMatrix on all APIs that take SkMatrix (i.e. arrays or Float32Arrays of length 6/9/16).
 - setEdging and setEmbeddedBitmaps to SkFont. You can disable the ability to draw aliased fonts (and save some code
   size) with the compile.sh argument `no_alias_font`.

### Removed
 - Previously deprecated functions `MakeSkDashPathEffect`, `MakeLinearGradientShader`,
   `MakeRadialGradientShader`, `MakeTwoPointConicalGradientShader`, `MakeSkCornerPathEffect`,
   `MakeSkDiscretePathEffect`

### Changed
 - CanvasKit colors are now represented with a TypedArray of four floats.
 - Calls to `getError` should be disabled. This may cause a performance improvement in some scenarios.

### Removed
 - SkPaint.setColorf is obsolete and removed. setColor accepts a CanvasKit color which is
   always composed of floats.
 - localmatrix option for `SkShader.Lerp` and `SkShader.Blend`.

### Deprecated
 - `SkCanvas.concat44` has been folded into concat (which now takes 3x2, 3x3, or 4x4 matrices). It will
   be removed soon.

### Fixed
 - Memory leak in paragraph binding code (https://github.com/flutter/flutter/issues/56938)
 - Safari now properly uses WebGL1 instead of WebGL2 when WebGL2 is not available (skbug.com/10171).

## [0.14.0] - 2020-03-18

### Added
 - `SkShader.MakeSweepGradient`
 - `SkCanvas.saveLayer` can now be called with 1 argument (the paint). In this case the current
   effective clip will be used, as the current rect is assumed to be null.
 - `SkPaint.setAlphaf`
 - Clients can supply `no_codecs` to compile.sh to remove all codec encoding and decoded code.
   This can save over 100 kb compressed if codecs are not needed.

### Deprecated
 - `MakeSkDashPathEffect` will be removed soon. Calls can be replaced with
   `SkPathEffect.MakeDash`.
 - `MakeLinearGradientShader` will be removed soon. Calls can be replaced with
   `SkShader.MakeLinearGradient`.
 - `MakeRadialGradientShader` will be removed soon. Calls can be replaced with
   `SkShader.MakeRadialGradient`.
 - `MakeTwoPointConicalGradientShader` will be removed soon. Calls can be replaced with
   `SkShader.MakeTwoPointConicalGradient`.

### Fixed
 - Shadows are properly draw on fillRect and strokeRect in the canvas2d emulation layer.
 - Shadow offsets properly ignore the CTM in the canvas2d emulation layer.

### Changed
 - Stop compiling jpeg and webp encoders by default. This results in a 100kb binary size reduction.
   Clients that need these encoders can supply `force_encode_webp` or `force_encode_jpeg` to
   compile.sh.

### Removed
 - Removed inverse filltypes.
 - Removed StrokeAndFill paint style.
 - Removed TextEncoding enum (it was only used internally). All functions assume UTF-8.

## [0.13.0] - 2020-02-28

### Deprecated
 - `MakeSkCornerPathEffect` will be removed soon. Calls can be replaced with
   `SkPathEffect.MakeCorner`.
 - `MakeSkDiscretePathEffect` will be removed soon. Calls can be replaced with
   `SkPathEffect.MakeDiscrete`.

### Added
 - `SkSurface.drawOnce` for drawing a single frame (in addition to already existing
   `SkSurface.requestAnimationFrame` for animation logic).
 - `CanvasKit.parseColorString` which processes color strings like "#2288FF"
 - Particles module now exposes effect uniforms, which can be modified for live-updating.
 - Experimental 4x4 matrices added in `SkM44`.
 - Vector math functions added in `SkVector`.
 - `SkRuntimeEffect.makeShaderWithChildren`, which can take in other shaders as fragmentProcessors.
 - `GrContext.releaseResourcesAndAbandonContext` to free up WebGL contexts.
 - A few methods on `SkFont`: `setHinting`, `setLinearMetrics`, `setSubpixel`.

### Changed
 - We now compile/ship with Emscripten v1.39.6.
 - `SkMatrix.multiply` can now accept any number of matrix arguments, multiplying them
    left-to-right.
 - SkMatrix.invert now returns null when the matrix is not invertible. Previously it would return an
   identity matrix. Callers must determine what behavior would be appropriate in this situation.
 - In Canvas2D compatibility layer, the underlying SkFont will have setSubpixel(true).
 - Bones are removed from Vertices builder

### Fixed
 - Support for .otf fonts (.woff and .woff2 still not supported).

## [0.12.0] - 2020-01-22

### Added
 - `SkFontMgr.countFamilies` and `SkFontMgr.getFamilyName` to expose the parsed font names.

### Changed
 - SKP serialization/deserialization now available (can be disabled with the 'no_skp').
   `SkPicture.DEBUGONLY_saveAsFile` renamed to `SkPicture.saveAsFile` and
   `CanvasKit.MakeSkPicture` is now exposed. SKP support is not shipped to npm builds.
   `force_serialize_skp` has been removed since it opt-out, not opt-in.

### Fixed
 - Bug that sometimes resulted in 'Cannot perform Construct on a neutered ArrayBuffer'
 - Bug with SkImage.readPixels (skbug.com/9788)
 - Bug with transparent colors in Canvas2d mode (skbug.com/9800)

## [0.11.0] - 2020-01-10

### Added
 - A "Core" build that removes Fonts, the Skottie animation player, the Particles demo,
   and PathOps is available in `bin/core/`. It is about half the size of the "CoreWithFonts"
   build.
 - Experimental Runtime shader available for custom builds.
 - WebP support.
 - `SkAnimatedImage.getCurrentFrame` which returns an SkImage.

### Fixed
 - `CanvasKit.SaveLayerInitWithPrevious` and `CanvasKit.SaveLayerF16ColorType` constants.
 - Some compilation configurations, for example, those with no fonts or just one of particles/skottie.

### Changed
 - Small tweaks to compilation settings to reduce code size and linkage time.
 - JS functions are no longer provided when the underlying c++ calls have been compiled out.

### Removed
 - `SkShader.Empty`
 - Support for Type 1 Fonts. These are ancient and removing them saves about 135k
   of code size.

### Breaking
 - In an effort to reduce code size for most clients, npm now contains two CanvasKit builds.
   In `bin/` there is the "CoreWithFonts" build that contains most functionality from 0.10.0.
   However, we no longer ship the Skottie animation player, nor the Particles demo. Further,
   PathOps are removed from this build `MakePathFromOp`, `SkPath.op` and `SkPath.simplify`.
   Clients who need any of those features are encouraged to create a custom build using
   `compile.sh`.
 - `SkPicture.DEBUGONLY_saveAsFile` was accidentally included in release builds. It has been
   removed. Clients who need this in a release build (e.g. to file a bug report that only
   reproduces in release) should do a custom build with the `force_serialize_skp` flag given.

### Deprecated
 - `SkCanvas.drawAnimatedImage` will be renamed soon. Calls can be replaced with `SkCanvas.drawImage`
   and `SkAnimatedImage.getCurrentFrame`.

## [0.10.0] - 2019-12-09

### Added
 - `SkContourMeasureIter` and `SkContourMeasure` as an alternative to `SkPathMeasure`.
 - CanvasKit image decode cache helpers: getDecodeCacheLimitBytes(), setDecodeCacheLimitBytes(),
   and getDecodeCacheUsedBytes().
 - `SkShader.Blend`, `SkShader.Color`, `SkShader.Empty`, `SkShader.Lerp`.

### Changed
 - The returned values from `SkParagraph.getRectsForRange` now have direction with value
   `CanvasKit.TextDirection`.

### Fixed
 - `MakeImage` properly in the externs file and can work with `CanvasKit.Malloc`.

## [0.9.0] - 2019-11-18
### Added
 - Experimental `CanvasKit.Malloc`, which can be used to create a
   TypedArray backed by the C++ WASM memory. This can save a copy in some cases
   (e.g. SkColorFilter.MakeMatrix). This is an advanced feature, so use it with care.
 - `SkCanvas.clipRRect`, `SkCanvas.drawColor`
 - Blur, ColorFilter, Compose, MatrixTransform SkImageFilters. Can be used with `SkPaint.setImageFilter`.
 - `SkCanvas.saveLayer` now takes 3 or 4 params to include up to bounds, paint, SkImageFilter, flags.
 - `SkPath.rArcTo`, `SkPath.rConicTo`, `SkPath.rCubicTo`, `SkPath.rLineTo`, `SkPath.rMoveTo`,
   `SkPath.rQuadTo`. Like their non-relative siblings, these are chainable.
 - Add `width()`, `height()`, `reset()`, `getFrameCount()` to SkAnimatedImage.
 - `SkCanvas.drawImageNine`, `SkCanvas.drawPoints` and related `PointMode` enum.
 - `SkPath.addPoly`
 - `SkPathMeasure.getSegment`
 - More information on SkParagraph API, eg. `getLongestLine()`, `getWordBoundary`, and others.

### Deprecated
 - `CanvasKit.MakeBlurMaskFilter` will be renamed/moved soon to `CanvasKit.SkMaskFilter.MakeBlur`.

### Changed
 - Use newer version of Freetype2 (Tracking Skia's DEPS now).
 - Use newer versions of libpng and zlib (Tracking Skia's DEPS now).

### Fixed
 - null dereference when sometimes falling back to CPU.
 - Actually ask WebGL for a stencil buffer.
 - Can opt out of Paragraph API with no_paragraph passed into compile.sh or when using primitive_shaper.

## [0.8.0] - 2019-10-21

### Added
 - `CanvasKit.MakeAnimatedImageFromEncoded`, `SkCanvas.drawAnimatedImage`.
 - `CanvasKit.SkFontMgr.FromData` which takes several ArrayBuffers of font data, parses
   them, reading the metadata (e.g. family names) and stores them into a SkFontMgr.
 - SkParagraph as an optional set of APIs for dealing with text layout.

### Changed
 - The `no_font` compile option should strip out more dead code related to fonts.
 - and `no_embedded_font` option now allows creating a `SkFontMgr.FromData` instead of
   always having an empty one.
 - Updated to emscripten 1.38.47
 - Switch to WebGL 2.0, but fall back to 1.0 when unavailable - bug.skia.org/9052

### Fixed
 - Null terminator bug in draw text - skbug.com/9314

## [0.7.0] - 2019-09-18

### Added
 - `SkCanvas.drawCircle()`, `SkCanvas.getSaveCount()`
 - `SkPath.offset()`, `SkPath.drawOval`
 - `SkRRect` support (`SkCanvas.drawRRect`, `SkCanvas.drawDRRect`, `CanvasKit.RRectXY`).
   Advanced users can specify the 8 individual radii, if needed.
 - `CanvasKit.computeTonalColors()`, which  returns TonalColors, which has an
   ambient SkColor and a spot SkColor.
 - `CanvasKit.SkColorFilter` and a variety of factories. `SkPaint.setColorFilter` is the only
   consumer of these at the moment.
 - `CanvasKit.SkColorMatrix` with functions `.identity()`, `.scaled()`, `.concat()` and
   others. Primarily for use with `CanvasKit.SkColorFilter.MakeMatrix`.

### Changed
 - `MakeSkVertices` uses a builder to save a copy.

### Breaking
 - When `SkPath.arcTo` is given seven arguments, it no longer turns the first four into
   a `SkRect` automatically, and instead uses them as
   `arcTo(rx, ry, xAxisRotate, useSmallArc, isCCW, x, y)` (see SkPath.h for more).

## [0.6.0] - 2019-05-06

### Added
 - `SkSurface.grContext` now exposed. `GrContext` has new methods for monitoring/setting
   the cache limits; tweaking these may lead to better performance in some cases.
   `getResourceCacheLimitBytes`, `setResourceCacheLimitBytes`, `getResourceCacheUsageBytes`
 - `SkCanvas.drawAtlas` for efficiently drawing multiple sprites from a sprite sheet with
   a set of transforms, color blends, etc.
 - `SkColorBuilder`, `RSXFormBuilder`, `SkRectBuilder` which increase performance by
   reducing the amount of malloc/free calls per frame, given that the array size is fixed.
 - Basic `SkPicture` support. `SkSurface.captureFrameAsSkPicture` is a helper function to
   capture an `SkPicture`, which can be dumped to disk (for debugging) with
   `SkPicture.DEBUGONLY_saveAsFile`.
 - `SkImage.readPixels`, which returns a TypedArray of pixel values (safe to use
   anywhere, doesn't need a delete()).

### Changed
 - Better `GrGLCaps` support for WebGL - this shouldn't have any impacts on APIs or
   correctness, except by perhaps fixing a few bugs in various surface types.
 - Use unsigned ints for SkColor on the JS side - this shouldn't have any impacts
   unless clients have pre-computed colors, in which case, they will need to re-compute them.
 - [breaking] Moved `CanvasKit.MakeImageShader` to `SkImage.makeShader` - removed clampUnpremul
   as argument.

## [0.5.1] - 2019-03-21

### Added
 - `SkPathMeasure`, `RSXFormBuilder`, `SkFont.getWidths`, `SkTextBlob.MakeFromRSXform`
   which were needed to add the helper function `SkTextBlob.MakeOnPath`.
 - `SkSurface.requestAnimationFrame` - wrapper around window.requestAnimationFrame that
   takes care of the setup/tear down required to use CanvasKit optimally. The callback
   has an `SkCanvas` as the first parameter - callers should draw on that.

### Changed
 - Location in Skia Git repo now `modules/canvaskit` (was `experimental/canvaskit`)

### Fixed
 - Extern bug in `CanvasKit.SkMatrix.invert`
 - Fallback to CPU now properly refreshes the canvas to get access to the
   CanvasRenderingContext2D.
 - Compile flags for better WebGL1 support for some graphics cards.
 - Antialias bug on large oval paths <https://crbug.com/skia/8873>

### Deprecated
 - `SkCanvas.flush` will be removed soon - client should only call `SkSurface.flush`


## [0.5.0] - 2019-03-08

### Added
 - isVolitile option to `CanvasKit.MakeSkVertices`. The previous (and current default) behavior
   was for this to be true; some applications may go faster if set to false.
 - `SkCanvas.saveLayer(rect, paint)`
 - `SkCanvas.restoreToCount(int)` which can be used with the output of .save() and .saveLayer().
 - Optional particles library from modules/particles. `See CanvasKit.MakeParticles(json)`;
 - More public APIs for working with Surfaces/Contexts `GetWebGLContext`,
   `MakeGrContext`, `MakeOnScreenGLSurface`, `MakeRenderTarget`.
 - `SkSurface.getSurface()` and `SkCanvas.getSurface()` for making compatible surfaces (typically
   used as a workspace and then "saved" with `surface.makeImageSnapshot()`)

### Breaking
 -  `CanvasKit.MakeWebGLCanvasSurface` no longer takes a webgl context as a first arg, only a
    canvas or an id of a canvas. If users want to manage their own GL contexts, they should build
    the `SkSurface` themselves with `GetWebGLContext` -> `MakeGrContext` ->
    `MakeOnScreenGLSurface`.

## [0.4.1] - 2019-03-01

### Added
 - Optional arguments to `MakeManagedAnimation` for supplying external assets (like images, fonts).

## [0.4.0] - 2019-02-25

### Added
 - `SkPath.addRoundRect`, `SkPath.reset`, `SkPath.rewind` exposed.
 - `SkCanvas.drawArc`, `SkCanvas.drawLine`, `SkCanvas.drawOval`, `SkCanvas.drawRoundRect` exposed.
 - Can import/export a SkPath to an array of commands. See `CanvasKit.MakePathFromCmds` and
   `SkPath.toCmds`.
 - `SkCanvas.drawTextBlob()` and `SkCanvas.SkTextBlob.MakeFromText()` to draw text to a canvas.
 - `CanvasKit.TextEncoding` enum. For use with `SkTextBlob`.
 - Text shaping with `ShapedText` object and `SkCanvas.drawText`. At compile time, one can choose
   between using Harfbuzz/ICU (default) or a primitive one ("primitive_shaper") which just does
   line breaking. Using Harfbuzz/ICU substantially increases code size (4.3 MB to 6.4 MB).

### Changed
 - `SkCanvas.drawText()` now requires an `SkFont` object for raw strings.


### Removed
 -  `SkPaint.setTextSize()`, `SkPaint.getTextSize()`, `SkPaint.setTypeface()`
   which should be replaced by using `SkFont`.
 - Deprecated `CanvasKitInit().then()` interface (see 0.3.1 notes)


### Fixed
 - Potential bug in `ready()` if already loaded.

## [0.3.1] - 2019-01-04
### Added
 - `SkFont` now exposed.
 - `MakeCanvasSurface` can now take a canvas element directly.
 - `MakeWebGLCanvasSurface` can now take a WebGL context as an integer and use it directly.

### Changed
 - `CanvasKitInit(...).then()` is no longer the recommended way to initialize things.
It will be removed in 0.4.0. Use `CanvasKitInit(...).ready()`, which returns a real Promise.

### Removed
- `SkPaint.measureText` - use `SkFont.measureText` instead.

## [0.3.0] - 2018-12-18

### Added
- Add Canvas2D JS layer. This mirrors the HTML Canvas API. This may be omitted at compile time
    it by adding `no_canvas` to the `compile.sh` invocation.
- `CanvasKit.FontMgr.DefaultRef()` and `fontmgr.MakeTypefaceFromData` to load fonts.
- Exposed `SkPath.setVolatile`. Some animations see performance improvements by setting
their paths' volatility to true.

### Fixed
- `SkPath.addRect` now correctly draws counter-clockwise vs clockwise.

### Changed
- `CanvasKit.MakeImageShader` no longer takes encoded bytes, but an `SkImage`, created from
    `CanvasKit.MakeImageFromEncoded`. Additionally, the optional parameters `clampIfUnpremul`
    and `localMatrix` have been exposed.
- `SkPath.arcTo` now takes `startAngle`, `sweepAngle`, `forceMoveTo` as additional parameters.
- `SkPath.stroke` has a new option `precision`  It defaults to 1.0.
- CanvasKit comes with one font (NotoMono) instead of the Skia TestTypeface. Clients are encouraged
  to use the new `fontmgr.MakeTypefaceFromData` for more font variety.

### Removed
- `CanvasKit.initFonts()` - no longer needed.


## [0.2.1] - 2018-11-20
Beginning of Changelog history
