📦 ⟩ v0.9.29 ⟩ Feb 7, 2022
- PDF exports now support the optional
matte
argument.
- When the
drawImage()
function is passed a Canvas object as its image source it will now rasterize the canvas before drawing. The prior behavior (in which it is drawn as a vector graphic) can now be accessed through the newdrawCanvas()
method which supports the same numerical arguments asdrawImage
but requires that its first argument be a Canvas.
- Regions erased using
clearRect()
are now properly antialiased - The
clip()
method now interprets the current translate/scale/rotate state correctly when combining clipping masks
- Upgraded Skia to milestone 97
📦 ⟩ v0.9.28 ⟩ Jan 12, 2022
- Added TypeScript definitions for extensions to the DOM spec (contributed by @cprecioso)
- Added 3D-perspective transformations via the new createProjection() context method
- Colors can now use the hwb() model
- The Canvas
.async
property has been deprecated and will be removed in a future release.- The
saveAs
,toBuffer
, andtoDataURL
methods will now be async-only (likewise the shorthand properties). - Use their synchronous counterparts (
saveAsSync
,toBufferSync
, andtoDataURLSync
) if you want to block execution while exporting images.
- The
- The ImageData constructor now orders its arguments properly: the optional buffer/array argument now comes first
- Fixed a stack overflow that was occurring when images became too deeply nested for the default deallocator to handle (primarily due to many thousands of image exports from the same canvas)
- The
source-in
,source-out
,destination-atop
, andcopy
composite operations now work correctly for paths rather than rendering shapes without color (contributed by @meihuanyu) - Shape primitives now behave consistently with browsers when being added to a non-empty path:
rect()
now issues an initialmoveTo
rather than extending the path, then leaves the ‘current’ point in its upper left cornerellipse()
extends the current path rather than implicitly closing it (contributed by @meihuanyu)arc()
also extends the current path rather than closing it
- Upgraded Skia to milestone 96
- Added workflow for creating docker build environments
📦 ⟩ v0.9.27 ⟩ Oct 23, 2021
- Added pre-compiled binaries for Alpine Linux using the musl C library
📦 ⟩ v0.9.26 ⟩ Oct 18, 2021
- Added pre-compiled binaries for 32-bit and 64-bit ARM on Linux (a.k.a. Raspberry Pi)
- Windows text rendering has been restored after failing due to changes involving the
icudtl.dat
file FontLibrary.use
now reports an error if the specified font file doesn't exist- Fixed a crash that could result from calling
measureText
with various unicode escapes
- Upgraded Skia to milestone 94
- Now embedding a more recent version of the FreeType library on Linux with support for more font formats
📦 ⟩ v0.9.25 ⟩ Aug 22, 2021
- Improved image scaling when a larger image is being shrunk down to a smaller size via
drawImage()
- modified
imageSmoothingQuality
settings to provide a more meaningful range acrosslow
,medium
, andhigh
measureText()
now returns correct metrics regardless of currenttextAlign
setting- Rolled back
icudtl.dat
changes on Windows (which suppressed the misleading warning message but required running as Administrator)
- Now using Neon v0.9 (with enhanced async event scheduling)
📦 ⟩ v0.9.24 ⟩ Aug 18, 2021
- Path2D objects now have a read/write
d
property with an SVG representation of the path’s contours and anunwind()
method for converting from even-odd to non-zero winding rules - The
createTexture()
context method returns CanvasTexture objects which can be assigned tofillStyle
orstrokeStyle
- Textures draw either a parallel-lines pattern or one derived from the provided Path2D object and positioning parameters
- The marker used when
setLineDash
is active can now be customized by assigning a Path2D to the context’slineDashMarker
property (default dashing can be restored by assigningnull
) - The marker’s orientation & shape relative to the path being stroked can be controlled by the
lineDashFit
property which defaults to"turn"
but can be set to"move"
(which preserves orientation) or"follow"
(which distorts the marker’s shape to match the contour)
- Removed use of the
??
operator which is unavailable prior to Node 14 - Prevented a spurious warning on windows incorrectly claiming that the
icudtl.dat
file could not be found
- The Path2D
simplify()
method now takes an optional fill-rule argument - Added support for versions of macOS starting with 10.13 (High Sierra)
📦 ⟩ v0.9.23 ⟩ Jul 12, 2021
- Conic béziers can now be drawn to the context or a Path2D with the
conicCurveTo()
method - Text can be converted to a Path2D using the context’s new
outlineText()
method - Path2D objects can now report back on their internal geometry with:
- the
edges
property which contains an array of line-drawing commands describing the path’s individual contours - the
contains()
method which tests whether a given point is on/within the path - the
points()
method which returns an array of[x, y]
pairs at the requested spacing along the curve’s periphery
- the
- A modified copy of a source Path2D can now be created using:
offset()
ortransform()
to shift position or apply a DOMMatrix respectivelyjitter()
to break the path into smaller sections and apply random noise to the segments’ positionsround()
to round off every sharp corner in a path to a particular radiustrim()
to select a percentage-based subsection of the path
- Two similar paths can be ‘tweened’ into a proportional combination of their coordinates using the
interpolate()
method
- Passing a Path2D argument to the
fill()
orstroke()
method no longer disturbs the context’s ‘current’ path (if one has been created usingbeginPath()
) - The
filter
property will now accept percentage values greater than 999%
- The
newPage()
andsaveAs()
methods now work in the browser, including the ability to save image sequences to a zip archive. The browser’s canvas is still doing all the drawing however, so file export formats will be limited to PNG and JPEG and none of the other Skia-specific extensions will be available. - The file-export methods now accept a
matte
value in their options object which can be used to set the background color for any portions of the canvas that were left semi-transparent - Canvas dimensions are no longer rounded-off to integer values (at least until a bitmap needs to be generated for export)
- Linux builds will now run on some older systems going back to glibc 2.24
📦 ⟩ v0.9.22 ⟩ Jun 09, 2021
- Rasterization and file i/o are now handled asynchronously in a background thread. See the discussion of Canvas’s new
async
property for details. - Output files can now be generated at pixel-ratios > 1 for High-DPI screens.
SaveAs
and the other canvas output functions all accept an optionaldensity
argument which is an integer ≥1 and will upscale the image accordingly. The density can also be passed using thefilename
argument by ending the name with an ‘@’ suffix likesome-image@2x.png
. - SVG exports can optionally convert text to paths by setting the
outline
argument totrue
.
- The canvas functions dealing with rasterization (
toBuffer
,toDataURL
,png
,jpg
,pdf
, andsvg
) and file i/o (saveAs
) are now asynchronous and returnPromise
objects. The old, synchronous behavior is still available on a canvas-by-canvas basis by setting itsasync
property tofalse
. - The optional
quality
argument accepted by the output methods is now a float in the range 0–1 rather than an integer from 0–100. This is consistent with the encoderOptions arg in the spec. Quality now defaults to 0.92 (again, as per the spec) rather than lossless.
measureText
was reporting zero when asked to measure a string that was entirely made of whitespace. This is still the case for ‘blank‘ lines whentextWrap
is set totrue
but in the default, single-line mode the metrics will now report the width of the whitespace.- Changed the way text rendering was staged so that SVG exports didn’t entirely omit(!) text from their output. As a result,
Context2D
s now use an externalTypesetter
struct to manage layout and rendering.
📦 ⟩ v0.9.21 ⟩ May 22, 2021
- Now runs on Windows and Apple Silicon Macs.
- Precompiled binaries support Node 10, 12, 14+.
- Image objects can be initialized from PNG, JPEG, GIF, BMP, or ICO data.
- Path2D objects can now be combined using boolean operators and can measure their own bounding boxes.
- Context objects now support
createConicGradient()
. - Image objects now return a promise from their
decode()
method allowing for async loading without theloadImage
helper.
- Calling
drawImage
with aCanvas
object as the argument now uses a SkiaPict
rather than aDrawable
as the interchange format, meaning it can actually respect the canvas's currentglobalAlpha
andglobalCompositeOperation
state (fixed #6). - Improved some spurious error messages when trying to generate a graphics file from a canvas whose width and/or height was set to zero (fixed #5).
CanvasPattern
s now respect theimageSmoothingEnabled
setting- The
counterclockwise
arg toellipse
andarc
is now correctly treated as optional.
- Made the
console.log
representations of the canvas-related objects friendlier. - Added new test suites for
Path2D
,Image
, andCanvas
’s format support. - Created workflows to automate precompiled binary builds, testing, and npm package updating.
📦 ⟩ v0.9.20 ⟩ Mar 27, 2021
- The
loadImage
helper can now handleBuffer
arguments
- Improved documentation of compilation steps and use of line height with
ctx.font
📦 ⟩ v0.9.19 ⟩ Aug 30, 2020
Initial public release 🎉