Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

fabric-all-modules

fabricjs25MIT5.3.0

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

canvas, graphic, graphics, SVG, node-canvas, parser, HTML5, object model

readme

Fabric.js

Build Status Code Climate Coverage Status Gitpod Ready-to-Code

Bower version NPM version Downloads per month CDNJS version

Bountysource Flattr this git repo

Fabric.js is a framework that makes it easy to work with HTML5 canvas element. It is an interactive object model on top of canvas element. It is also an SVG-to-canvas parser.

Using Fabric.js, you can create and populate objects on canvas; objects like simple geometrical shapes — rectangles, circles, ellipses, polygons, or more complex shapes consisting of hundreds or thousands of simple paths. You can then scale, move, and rotate these objects with the mouse; modify their properties — color, transparency, z-index, etc. You can also manipulate these objects altogether — grouping them with a simple mouse selection.

Non-Technical Introduction to Fabric

Fabric.js allows you to easily create simple shapes like rectangles, circles, triangles and other polygons or more complex shapes made up of many paths, onto the HTML <canvas> element on a webpage using JavaScript. Fabric.js will then allow you to manipulate the size, position and rotation of these objects with a mouse. It’s also possible to change some of the attributes of these objects such as their color, transparency, depth position on the webpage or selecting groups of these objects using the Fabric.js library. Fabric.js will also allow you to convert an SVG image into JavaScript data that can be used for putting it onto the <canvas> element.

Contributions are very much welcome!

Goals

Supported browsers

  • Firefox 4+
  • Safari 5+
  • Opera 9.64+
  • Chrome (all versions)
  • Edge (chromium based, all versions)
  • IE11 and Edge legacy, not supported. Fabric up to 5.0 is written with ES5 in mind, but no specific tests are run for those browsers.

You can run automated unit tests right in the browser.

History

Fabric.js started as a foundation for design editor on printio.ru — interactive online store with ability to create your own designs. The idea was to create Javascript-based editor, which would make it easy to manipulate vector shapes and images on T-Shirts. Since performance was one of the most critical requirements, we chose canvas over SVG. While SVG is excellent with static shapes, it's not as performant as canvas when it comes to dynamic manipulation of objects (movement, scaling, rotation, etc.). Fabric.js was heavily inspired by Ernest Delgado's canvas experiment. In fact, code from Ernest's experiment was the foundation of an entire framework. Later, Fabric.js grew into a collection of distinct object types and got an SVG-to-canvas parser.

Installation Instructions

Install with bower

$ bower install fabric

Install with npm

Note: If you are using Fabric.js in a Node.js script, you will depend from node-canvas.node-canvas is an html canvas replacement that works on top of native libraries. Please follow the instructions located here in order to get it up and running.

$ npm install fabric --save

After this, you can import fabric like so:

const fabric = require("fabric").fabric;

Or you can use this instead if your build pipeline supports ES6 imports:

import { fabric } from "fabric";

NOTE: es6 imports won't work in browser or with bundlers which expect es6 module like vite. Use commonjs syntax instead.

See the example section for usage examples.

Building

  1. Install Node.js

  2. Build distribution file [~77K minified, ~20K gzipped]

     $ node build.js

    2.1 Or build a custom distribution file, by passing (comma separated) module names to be included.

       $ node build.js modules=text,serialization,parser
       // or
       $ node build.js modules=text
       // or
       $ node build.js modules=parser,text
       // etc.

    By default (when none of the modules are specified) only basic functionality is included. See the list of modules below for more information on each one of them. Note that default distribution has support for static canvases only.

    To get minimal distribution with interactivity, make sure to include corresponding module:

       $ node build.js modules=interaction

    2.2 You can also include all modules like so:

       $ node build.js modules=ALL

    2.3 You can exclude a few modules like so:

       $ node build.js modules=ALL exclude=gestures,image_filters
  3. Create a minified distribution file

     # Using YUICompressor (default option)
     $ node build.js modules=... minifier=yui
    
     # or Google Closure Compiler
     $ node build.js modules=... minifier=closure
  4. Enable AMD support via require.js (requires uglify)

     $ node build.js requirejs modules=...
  5. Create source map file for better productive debugging (requires uglify or google closure compiler).
    More information about source maps.

     $ node build.js sourcemap modules=...

    If you use google closure compiler you have to add sourceMappingURL manually at the end of the minified file all.min.js (see issue https://code.google.com/p/closure-compiler/issues/detail?id=941).

     //# sourceMappingURL=fabric.min.js.map
  6. Ensure code guidelines are met (prerequisite: npm -g install eslint)

     $ npm run lint && npm run lint_tests

Testing

  1. Install Node.js

  2. Install NPM, if necessary

  3. Install NPM packages

     $ npm install
  4. Run test suite

Make sure testem is installed

    $ npm install -g testem

Run tests Chrome and Node (by default):

    $ testem

See testem docs for more info: https://github.com/testem/testem

Demos

Who's using Fabric?

Documentation

Documentation is always available at http://fabricjs.com/docs/.

Also see official 4-part intro series, presentation from BK.js and presentation from Falsy Values for an overview of fabric.js, how it works, and its features.

Optional modules

These are the optional modules that could be specified for inclusion, when building custom version of fabric:

  • text — Adds support for static text (fabric.Text)
  • itext — Adds support for interactive text (fabric.IText, fabric.Textbox)
  • serialization — Adds support for loadFromJSON, loadFromDatalessJSON, and clone methods on fabric.Canvas
  • interaction — Adds support for interactive features of fabric — selecting/transforming objects/groups via mouse/touch devices.
  • parser — Adds support for fabric.parseSVGDocument, fabric.loadSVGFromURL, and fabric.loadSVGFromString
  • image_filters — Adds support for image filters, such as grayscale of white removal.
  • easing — Adds support for animation easing functions
  • node — Adds support for running fabric under node.js, with help of jsdom and node-canvas libraries.
  • freedrawing — Adds support for free drawing
  • erasing — Adds support for object erasing using an eraser brush
  • gestures — Adds support for multitouch gestures with help of Event.js
  • object_straightening — Adds support for rotating an object to one of 0, 90, 180, 270, etc. depending on which is angle is closer.
  • animation — Adds support for animation (fabric.util.animate, fabric.util.requestAnimFrame, fabric.Object#animate, fabric.Canvas#fxCenterObjectH/#fxCenterObjectV/#fxRemove)

Additional flags for build script are:

  • requirejs — Makes fabric requirejs AMD-compatible in dist/fabric.js. Note: an unminified, requirejs-compatible version is always created in dist/fabric.require.js
  • no-strict — Strips "use strict" directives from source
  • no-svg-export — Removes svg exporting functionality
  • sourcemap - Generates a sourceMap file and adds the sourceMappingURL (only if uglifyjs is used) to dist/fabric.min.js

For example:

node build.js modules=ALL exclude=json no-strict no-svg-export

Examples of use

Adding red rectangle to canvas

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <canvas id="canvas" width="300" height="300"></canvas>

    <script src="lib/fabric.js"></script>
    <script>
        var canvas = new fabric.Canvas('canvas');

        var rect = new fabric.Rect({
            top : 100,
            left : 100,
            width : 60,
            height : 70,
            fill : 'red'
        });

        canvas.add(rect);
    </script>
</body>
</html>

Helping Fabric

Staying in touch

Follow @fabric.js, @kangax or @AndreaBogazzi on twitter.

Questions, suggestions — fabric.js on Google Groups.

See Fabric questions on Stackoverflow, Fabric snippets on jsfiddle or codepen.io.

Fabric on LibKnot.

Get help in Fabric's IRC channel — irc://irc.freenode.net/#fabric.js

Credits

MIT License

Copyright (c) 2008-2015 Printio (Juriy Zaytsev, Maxim Chernyak)

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 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.

changelog

Changelog

[5.4.0]

  • fix() fix an issue with offScreen detection and background/overlay Vpt setting #8896

[5.2.1]

  • fix(): add eraser to Object state/cache props #7720

[5.2.0]

  • feat(fabric.Object): isType accepts multiple type #7715
  • chore(): Replace deprecated String.prototype.substr() with Array.prototype.slice() #7696
  • chore(): use Array.isArray instead of ie6+ workarounds #7718
  • MINOR: feat(fabric.Canvas): add getTopContext method to expose the internal contextTop #7697
  • fix(fabric.Object) Add cacheContext checks before trying to render on cache #7694
  • tests(): node test suite enhancement #7691
  • feat(Canvas#getCenter): migrate to getCenterPoint #7699
  • updated package.json 803ce95
  • tests(fabric.animation): fix test reliability 4be0fb9

[5.1.0]

  • build(deps): bump node-fetch from 2.6.6 to 2.6.7 #7684
  • build(deps): bump follow-redirects from 1.14.6 to 1.14.8 #7683
  • build(deps): bump simple-get from 3.1.0 to 3.1.1 #7682
  • build(deps): bump engine.io from 6.1.0 to 6.1.2 #7681
  • fix(test): Remove expect assertion #7678
  • docs(blendimage_filter.class.js) corrected mode options #7672
  • chore(): Update bug_report.md #7659
  • fix(util.animation): remove extra animation cancel #7631
  • feat(animation): Support a list of animation values for animating matrices changes #7633
  • ci(tests): windows and linux paths resolutions #7635

[5.0.0]

  • fix(fabric.Canvas): unflag contextLost after a full re-render #7646
  • BREAKING: remove 4.x deprecated code #7630
  • feat(fabric.StaticCanvas, fabric.Canvas): limit breaking changes #7627
  • feat(animation): animations registry #7528
  • docs(): Remove not working badges #7623
  • ci(): add auto-changelog package to quickly draft a changelog #7615
  • feat(fabric.EraserBrush): added eraser property to Object instead of attaching to clipPath, remove hacky getClipPath/setClipPath #7470, see BREAKING comments.
  • feat(fabric.EraserBrush): support inverted option to undo erasing #7470
  • fix(fabric.EraserBrush): fix doubling opaic objects while erasing #7445 #7470
  • BREAKING: fabric.EraserBrush: The Eraser object is now a subclass of Group. This means that loading from JSON will break between versions. Use this code to transform your json payload to the new version.
  • feat(fabric.Canvas): fire an extra mouse up for the original control of the initial target #7612
  • fix(fabric.Object) bounding box display with skewY when outside group #7611
  • fix(fabric.text) fix rtl/ltr performance issues #7610
  • fix(event.js) Prevent dividing by 0 in for touch gestures #7607
  • feat(): drop:before event #7442
  • ci(): Add codeql analysis step #7588
  • security(): update onchange to solve security issue #7591
  • BREAKING: fix(): MAJOR prevent render canvas with quality less than 100% #7537
  • docs(): fix broken link #7579
  • BREAKING: Deps(): MAJOR update to jsdom 19 node 14 #7587
  • Fix(): JSDOM transative vulnerability #7510
  • fix(fabric.parser): attempt to resolve some issues with regexp #7520
  • fix(fabric.IText) fix for possible error on copy paste #7526
  • fix(fabric.Path): Path Distance Measurement Inconsistency #7511
  • Fix(fabric.Text): Avoid reiterating measurements when width is 0 and measure also empty lines for consistency. #7497
  • fix(fabric.Object): stroke bounding box #7478
  • fix(fabric.StaticCanvas): error of changing read-only style field #7462
  • fix(fabric.Path): setting path during runtime #7141
  • chore() update canvas to 2.8.0 #7415
  • fix(fabric.Group) realizeTransfrom should be working when called with NO parent transform #7413
  • fix(fabric.Object) Fix control flip and control box #7412
  • feat(fabric.Text): added pathAlign property for text on path #7362
  • docs(): Create SECURITY.md #7405
  • docs(): Clarify viewport transformations doc #7401
  • docs(): specify default value and docs for enablePointerEvents #7386
  • feat(fabric.PencilBrush): add an option to draw a straight line while pressing a key #7034

[4.6.0]

  • feat(fabric.util): added fabric.util.transformPath to add transformations to path points #7300
  • feat(fabric.util): added fabric.util.joinPath, the opposite of fabric.util.parsePath #7300
  • fix(fabric.util): use integers iterators #7233
  • feat(fabric.Text) add path rendering to text on path #7328
  • feat(fabric.iText): Add optional hiddenTextareaContainer to contain hiddenTextarea #7314
  • fix(fabric.Text) added pathStartOffset and pathSide to props lists for object export #7318
  • feat(animate): add imperative abort option for animations #7275
  • fix(Fabric.text): account for fontSize in textpath cache dimensions ( to avoid clipping ) #7298
  • feat(Observable.once): Add once event handler #7317
  • feat(fabric.Object): Improve drawing of controls in group. #7119
  • fix(EraserBrush): intersectsWithObject edge cases #7290
  • fix(EraserBrush): dump canvas bg/overlay color support #7289
  • feat(fabric.Text) added pathSide property to text on path #7259
  • fix(EraserBrush) force fill value #7269
  • fix(fabric.StaticCanvas) properly remove objects on canvas.clear #6937
  • feat(fabric.EraserBrush): improved erasing:end event #7258
  • fix(shapes): fabric.Object._fromObject never should return #7201
  • feat(fabric.filters) Added vibrance filter (for increasing saturation of muted colors) #7189
  • fix(fabric.StaticCanvas): restore canvas size when disposing #7181
  • feat(fabric.util): added convertPointsToSVGPath that will convert from a list of points to a smooth curve. #7140
  • fix(fabric.Object): fix cache invalidation issue when objects are rotating #7183
  • fix(fabric.Canvas): rectangle selection works with changing viewport #7088
  • feat(fabric.Text): textPath now support textAlign #7156
  • fix(fabric.EraserBrush): test eraser intersection with objects taking into account canvas viewport transform #7147
  • fix(fabric.Object): support excludeFromExport set on clipPath #7148.
  • fix(fabric.Group): support excludeFromExport set on objects #7148.
  • fix(fabric.StaticCanvas): support excludeFromExport set on backgroundColor, overlayColor, clipPath #7148.
  • fix(fabric.EraserBrush): support object resizing (needed for eraser) #7100.
  • fix(fabric.EraserBrush): support canvas resizing (overlay/background drawables) #7100.
  • fix(fabric.EraserBrush): propagate clipPath of group to erased objects when necessary so it is correct when ungrouping/removing from group #7100.
  • fix(fabric.EraserBrush): introduce erasable = deep option for fabric.Group #7100.
  • feat(fabric.Collection): the contains method now accepts a second boolean parameter deep, checking all descendants, collection.contains(obj, true) #7139.
  • fix(fabric.StaticCanvas): disposing canvas now restores canvas size and style to original state.

[4.5.1]

  • fix(fabric.Text): fixes decoration rendering when there is a single rendering for full text line #7104
  • fix(fabric.Text): spell error which made the gradientTransform not working #7059
  • fix(fabric.util): unwanted mutation in fabric.util.rotatePoint #7117
  • fix(svg parser): Ensure that applyViewboxTransform returns an object and not undefined/null #7030
  • fix(fabric.Text): support firefox with ctx.textAlign for RTL text #7126

[4.5.0]

  • fix(fabric.PencilBrush) decimate deleting end of a freedrawing line #6966
  • feat(fabric.Text): Adding support for RTL languages by adding direction property #7046
  • feat(fabric) Add an eraser brush as optional module #6994
  • fix v4: 'scaling' event triggered before object position is adjusted #6650
  • Fix(fabric.Object): CircleControls transparentCorners styling #7015
  • Fix(svg_import): svg parsing in case it uses empty use tag or use with image href #7044
  • fix(fabric.Shadow): offsetX, offsetY and blur supports float #7019

[4.4.0]

  • fix(fabric.Object) wrong variable name cornerStrokeColor #6981
  • fix(fabric.Text): underline color with text style ( regression from text on a path) #6974
  • fix(fabric.Image): Cache CropX and CropY cache properties #6924
  • fix(fabric.Canvas): Add target to each selection event #6858
  • fix(fabric.Image): fix wrong scaling value for the y axis in renderFill #6778
  • fix(fabric.Canvas): set isMoving on real movement only #6856
  • fix(fabric.Group) make addWithUpdate compatible with nested groups #6774
  • fix(Fabric.Text): Add path to text export and import #6844
  • fix(fabric.Canvas) Remove controls check in the pixel accuracy target #6798
  • feat(fabric.Canvas): Added activeOn 'up/down' property #6807
  • feat(fabric.BaseBrush): limitedToCanvasSize property to brush #6719

[4.3.1]

  • fix(fabric.Control) implement targetHasOneFlip using shorthand #6823
  • fix(fabric.Text) fix typo in cacheProperties preventing cache clear to work #6775
  • fix(fabric.Canvas): Update backgroundImage and overlayImage coordinates on zoom change #6777
  • fix(fabric.Object): add strokeuniform to object toObject output. #6772
  • fix(fabric.Text): Improve path's angle detection for text on a path #6755

[4.3.0]

  • fix(fabric.Textbox): Do not let splitbygrapheme split text previously unwrapped #6621
  • feat(fabric.controlsUtils) Move drag to actions to control handlers #6617
  • feat(fabric.Control): Add custom control size per control. #6562
  • fix(svg_export): svg export in path with gradient and added tests #6654
  • fix(fabric.Text): improve compatibility with transformed gradients #6669
  • feat(fabric.Text): Add ability to put text on paths BETA #6543
  • fix(fabric.Canvas): rotation handle should take origin into account #6686
  • fix(fabric.Text): Text on path, fix non linear distance of chars over path #6671

[4.2.0]

  • fix(fabric.utils): ISSUE-6566 Fix SVGs for special Arc lines #6571
  • fix(fabric.Canvas): Fix mouse up target when different from action start #6591
  • added: feat(fabric.controlsUtils): Fire resizing event for textbox width #6545

[4.1.0]

  • feat(Brushes): add beforePathCreated event #6492;
  • feat(fabric.Path): Change the way path is parsed and drawn. simplify path at parsing time #6504;
  • feat(fabric.Path): Simplify S and T command in C and Q. #6507;
  • fix(fabric.Textbox): ISSUE-6518 Textbox and centering scaling #6524;
  • fix(fabric.Text): Ensure the shortcut text render the passed argument and not the entire line #6526;
  • feat(fabric.util): Add a function to work with path measurements #6525;
  • fix(fabric.Image): rendering pixel outside canvas size #6326;
  • fix(fabric.controlsUtils): stabilize scaleObject function #6540;
  • fix(fabric.Object): when in groups or active groups, fix the ability to shift deselect #6541;

[4.0.0]

  • fixed the gesture module to not break with 4.0 #6491;
  • fix(fabric.IText): copy style in non full mode when typing text #6454;
  • feat(fabric.Controls) expose the extra utils for control handling. Breaking: rename fabric.controlHandlers and fabric.controlRenderers to fabric.controlsUtils.

[4.0.0-rc.1]

  • fix(fabric.Canvas): ISSUE-6314 rerender in case of drag selection that select a single oobject. #6421;
  • feat(text): allow correct cursor/selection position if text is edited inside a group. #6256;
  • feat(fabric.Control): remove position option in favor of x and y #6415;
  • fix(fabric.Object) ISSUE-6340 infinite recursion on groups #6416;
  • fix(fabric.Object): geometry mixin fix partiallyOnscreen #6402;
  • fix(fabric.Image): ISSUE-6397 modify crossOrigin behaviour for setSrc #6414;
  • Breaking: fabric.Image.setCrossOrigin is gone. Having the property on the fabric.Image is misleading and brings to errors. crossOrigin is for loading/reloading only, and is mandatory to specify it each load.
  • Breaking: fabric.Control constructor does not accept anymore a position object, but 2 properties, x and y.

[4.0.0-beta.12]

  • fix(fabric.IText): respect value of cursorColor #6300;
  • fix(fabric.Textbox): Improve splitByGrapheme and charSpacing #6298;
  • feat(controls): Reintroduce flip by scaling and lockScalingFlip #6313;

[4.0.0-beta.11]

  • fix(itext): improved style handling for new lines #6268
  • fix(controls): Fix flip and controls and skewY and controls. #6278
  • fix(controls): Current position with handlers is wrong if using skew #6267
  • breaking: setCoords has only one argument now skipCorners boolean. setCoords will always update aCoords, lineCoords. If skipCorners is not specified, it will alos update oCoords();
  • feat(fabric.Image): Image.imageSmoothing for fabric.Image objects #6280
  • fix(fabric.StaticCanvas): export to dataUrl and canvasElement will respect imageSmoothingEnabled #6280
  • fix(fabric.Image): toSVG export with missing element won't crash #6280
  • added: added fabric.util.setImageSmoothing(ctx, value);
  • added svg import/export for image image-rendering attribute
  • fix(svg_import): Fix some parsing logic for nested SVGs. #6284
  • fix(fabric.Image): do not crash if image has no element #6285

BREAKING:

  • removed 2 utils member that was not used anywhere: fabric.util.getScript, fabric.util.getElementStyle
  • remove private member _setImageSmoothing in the canvas: use fabric.util.setImageSmoothing(ctx, value);

[4.0.0-beta.10]

  • fix(controls): fix missing target in canvas event options #6251
  • fix(controls): correct position for offsets #6250
  • feat(utils): Added more error flag passing throughout functions #6238

[4.0.0-beta.9]

  • fix(controls) show offsetX/offsetY correctly. #6236
  • fix(controls) ISSUE-6201 Restore per object setting of controls visibility #6226
  • fix(svg_parser): ISSUE-6220 Allow to parse font declaration that start with a number #6222

[4.0.0-beta.8]

  • fix(IText) Stop composition events on mousedown to enable cursor position on android keyboards #6224
  • fix(controls): Handle textbox width change properly #6219
  • fix(controls): correctly handling the uniform scaling option #6218
  • fix(fabric.Object): fix activeSelection toDataURL canvas restore #6216
  • fix(svg_parsers): Add support for empty <style/> tags #6169
  • fix(SVG_export, text): Check font faces markup for objects within groups #6195
  • feat(animation): Extend fabric.util.animate animating colors and other properties#6191
  • fix(svg_export): remove extra space from svg export #6209
  • fix(svg_import): ISSUE-6170 do not try to create missing clippath #6210
  • fix(fabric.Object) Adding existence check for this.canvas on object stacking mixins #6207

[4.0.0-beta.7]

feat(controls): Added controls mouseUpHandler and mouseDownHandler #6158 Removal of deprecated methods / patterns. #6111

  • removed Object.setShadow, and BaseBrush.setShadow. change rect.setShadow(options) to rect.set('shadow', new fabric.Shadow(options))
  • removed Object.transformMatrix.
  • removed object:selected event. use selection:created. In the callback you will still find target in the options, but also you will find selected with all the objects selected during that single event.
  • removed Gradient.forObject. No alternative available.
  • removed Object and canvas clipTo. Use Object.clipPath;
  • removed Canvas.loadFromDatalessJSON, it was just an alias for loadFromJSON
  • removed observe, stopObserving, trigger from observable. Keep using on, off, fire.
  • removed the Object.set ability to take a function as a value. Was rather strange to use.
  • removed Object.setGradient. Change rect.setGradient(options) with rect.set('fill', new fabric.Gradient(otherOptions)). The options format is slightly different, but keeping 2 formats does not really make sense.
  • removed Object.setPatternFill. Change rect.setPatternFill(options) to rect.set('fill', new fabric.Pattern(options));
  • removed Object.setColor. Change rect.setColor(color) to rect.set('fill', color)
  • removed fabric.util.customTransformMatrix. Use the replacement fabric.util.composeMatrix

[4.0.0-beta.6]

fix(fabric.IText): exitEditing won't error on missing hiddenTextarea. #6138

[4.0.0-beta.5]

fix(fabric.Object): getObjectScaling takes in account rotation of objects inside groups. #6118

[4.0.0-beta.4]

fix(fabric.Group): will draw shadow will call parent method. #6116

[4.0.0-beta.3]

fix(controls): control offset rendering code had extras beginPath that would clear all but not the last of them #6114

[4.0.0-beta.2]

fix(controls): Control.getVisibility will always receive the fabric.Object argument.

[4.0.0-beta.1]

breaking: All your old control code override will not work breaking: uniScaleTransform has been renamed in uniformScaling, meaning changed and the default value swapped. The behaviour is unchanged, but now the description and the name match. breaking: Object.lockUniScaling is removed. Alternatives to get the same identical functionality with less code are being evaluated. breaking: Canvas.onBeforeScaleRotate is removed, developers need to migrate to the event `before:transform’

[3.6.2]

  • fix fabric.Object.toDataURL blurriness on images with odd pixel number #6131

[3.6.1]

  • fix(gradient, text): ISSUE-6014 ISSUE-6077 support percentage gradient in text #6090
  • fix(filters): ISSUE-6072 convolution filter is off by one #6088
  • fix(transform): Fix a bug in the skewing logic #6082

[3.6.0]

  • fix: ISSUE-5512 better Clippath transform parsing in SVG #5983
  • fix: ISSUE-5984 Avoid enter editing in non selectable object #5989
  • Tweak to object._setLineDash to avoid cycles when nothing in array #6000
  • fix: ISSUE-5867 Fix the extra new line selection with empty line #6011
  • Improvement: Use SVG Namespace for SVG Elements #5957
  • Improvement: ISSUE-4115 - triggers in/out events for sub targets #6013
  • Improvement: Upper canvas retina scaling #5938

[3.5.1]

  • Fix for textbox non defined in scaleObject #5896
  • Fix canvas pattern as background and exports #5973
  • Fix for type error if style is null when checking if is empty #5971
  • Fix for load from datalessJSON for svg groups with sourcePath #5970

[3.5.0]

  • Deprecation: deprecated 3 method of the api that will disappear in fabric 4: setPatternFill, setColor, setShadow.
  • Fix: remove line dash modification for strokeUniform #5953
  • Improvement: ISSUE-5955 parse svg clip-path recursively #5960
  • Fix: object.toCanvasElement of objects in groups #5962
  • change pencil brush finalize to be in line with other brushes #5866

[3.4.0]

  • Support fill-opacity on gradient parsing from SVG. #5812
  • Rewrite gradient parsing from SVG to work with more transformation and combinations of attributes. #5836
  • Added Gradient.gradientUnits property to support percent based gradients on shapes.#5836
  • Changed animation logic so that onComplete gets always called with the final values of the animation.#5813

[3.3.0]

  • Differently support multi mouse events, fix multi touch on various browser #5785
  • Word boundary search update on grapheme clusters #5788
  • Enable deps free version #5786
  • Remove variables named as reserved words #5782

[3.2.0]

  • Fix: Better handling of upperCanvas in toCanvasElement. #5736
  • Add: Pass raw event information to brushes #5687
  • Deprecation: officially deprecated Object.transformMatrix #5747
  • Fix: Fix group.toSVG regression. #5755
  • Fix: PencilBrush regression on simple points. #5771

[3.1.0]

  • Fix: unbreak IE10. #5678
  • Improvement: Support scientific notation with uppercase E. #5731
  • Add: PencilBrush brush now support decimate property to remove dots that are too near to each other. #5718

[3.0.0]

  • Breaking: removed support for node 4 and 6. #5356
  • Breaking: changed objectCaching meaning to disable caching only if possible. #5566
  • Breaking: private method _setLineStyle can set only empty object now #5588
  • Breaking: private method _getLineStyle can only return boolean now #5588
  • Fix: splitByGrapheme can now handle cursor properly #5588
  • Add: Added hasStroke and hasFill, helper methods for decisions on caching and for devs, change image shouldCache method #5567
  • Fix: Canvas toObject won't throw error now if there is a clipPath #5556
  • Add: added nonScaling property to shadow class #5558
  • Fix: fixed import of Rect from SVG when has 0 dimensions. #5582
  • Fix: Shadow offset in dataurl export with retina #5593
  • Fix: Text can be used as clipPath in SVG export (output is not correct yet) #5591
  • Add: Fabric.disableStyleCopyPasting to disable style transfers on copy-paste of itext #5590
  • Fix: avoid adding quotes to fontFamily containing a coma #5624
  • Fix: strokeUniform and cache dimensions #5626
  • Fix: Do not call onSelect on objects that won't be part of the selection #5632
  • Fix: fixed handling of empty lines in splitByGrapheme #5645
  • Fix: Textbox selectable property not restored after exitEditing #5655
  • Fix: 'before:selection:cleared' event gets target in the option passed #5658
  • Added: enablePointerEvents options to Canvas activates pointer events #5589
  • Fix: Polygon/Polyline/Path respect points position when initializing #5668
  • Fix: Do not load undefine objects in group/canvas array when restoring from JSON or SVG. #5684
  • Improvement: support for canvas background or overlay as gradient #5684
  • Fix: properly restore clipPath when restoring from JSON #5641
  • Fix: respect chainable attribute in observable mixin #5606

[2.7.0]

  • Add: strokeUniform property, avoid stroke scaling with paths #5473
  • Fix: fix bug in image setSrc #5502
  • Add: strokeUniform import/export svg #5527
  • Fix: GraphemeSplit and toSvg for circle #5544
  • Improvement: support running in a XML document #5530

[2.6.0]

  • Fix: avoid ie11 to throw on weird draw images #5428
  • Fix: a rare case of invisible clipPath #5477
  • Fix: testability of code under node when webgl is involved #5478
  • Add: Grapeheme text wrapping for Textbox (Textbox.splitByGrapheme) #5479
  • Add: fabric.Object.toCanvasElement #5481

[2.5.0]

  • Fix: textbox transform report newScaleX and newScaleY values #5464
  • Fix: export of svg and gradient with transforms #5456
  • Fix: detection of controls in perPixelTargetFind + cache #5455
  • Add: added canvas.toCanvasElement method #5452

[2.4.6]

  • Fix: unbreak the svg export broken in 2.4.5 #5438

[2.4.5]

  • Fix: svg import/export for canvas+clipPath and letterspacing. #5424
  • Fix: avoid stroke dash from group selection to leak on upper canvas #5392

[2.4.4]

  • Fix: add clipPath to stateful cache check. #5384
  • Fix: restore draggability of small objects #5379
  • Improvement: Added strokeDashOffset to objects and from SVG import. #5398
  • Fix: do not mark objects as invisible if strokeWidth is > 0 #5382
  • Improvement: Better gradients parsing with xlink:href #5357

[2.4.3]

  • Fix: Shift click and onSelect function #5348
  • Fix: Load from Json from images with filters and resize filters #5346
  • Fix: Remove special case of 1x1 rect #5345
  • Fix: Group with clipPath restore #5344
  • Fix: Fix shift + click interaction with unselectable objects #5324

[2.4.2]

  • Fix: Better toSVG support to enable clipPath #5284
  • Fix: Per pixel target find and groups and sub targets #5287
  • Fix: Object clone as Image and shadow clipping #5308
  • Fix: IE11 loading SVG #5307

[2.4.1]

  • Fix: Avoid enterEditing if another object is the activeObject #5261
  • Fix: clipPath enliving for Image fromObject #5279
  • Fix: toDataURL and canvas clipPath #5278
  • Fix: early return if no xml is available #5263
  • Fix: clipPath svg parsing in nodejs #5262
  • Fix: Avoid running selection logic on mouse up #5259
  • Fix: fix font size parsing on SVG #5258
  • Fix: Avoid extra renders on mouseUp/Down #5256

[2.4.0]

  • Add: Add clipPath support to canvas and svg import/export. Low compatibility yet.

[2.3.6]

  • Fix: Make image.class aware of naturalWidth and naturalHeight. #5178
  • Fix: Make 2 finger events works again #5177
  • Fix: Make Groups respect origin and correct position ( fix spray/circle brushes ) #5176

[2.3.5]

  • Change: make canvas.getObjects() always return a shallow copy of the array #5162
  • Fix: Improve fabric.Pattern.toSVG to look correct on offsets and no-repeat #5164
  • Fix: Do not enter edit in Itext if the mouseUp is relative to a group selector #5153
  • Improvement: Do not require xlink namespace in front of href attribut for svgs ( is a SVG2 new spec, unsupported ) #5156
  • Fix: fix resizeFilter having the wrong cached texture, also improved interaction between filters #5165

[2.3.4]

  • Fix: ToSVG was ignoring excludeFromExport for backgroundImage and OverlayImage. #5075
  • Fix: ToSVG for circle with start and end angles. #5085
  • Fix: Added callback for setPatternFill. #5101
  • Fix: Resize filter taking in account multiple scale sources. #5117
  • Fix: Blend image filter clean after refilter. #5121
  • Fix: Object.toDataURL should not be influenced by zoom. #5139
  • Improvement: requestRenderAllBound add to Canvas instance. #5138
  • Improvement: Make path bounding cache optional and also reacheable/cleanable #5140
  • Improvement: Make the logic of isNeutralState filters work before filtering start. #5129
  • Improvement: Added some code to clean up some memory when canvas is disposed in nodejs. #5142
  • Fix: Make numeric origins work with group creation. #5143

[2.3.3]

  • Fix: Fixed font generic names for text, measurement of zero width related characters and also trailing of cursor when zooming. #5048

[2.3.2]

  • Fix: justify + charspacing + textDecoration Add and improve more events for transformations and mouse interaction. #5007 #5009
  • Fix: Enter edit on object selected programmatically. #5010
  • Fix: Canvas.dispose was not removing all events properly. #5020
  • Fix: Make rgba and hsla regex work case insensitive. #5017
  • Fix: Make group transitioning from not cached to cached work. #5021

[2.3.1]

  • Improve nested svg import and text positioning, spikes. #4984

[2.3.0]

  • Add and improve more events for transformations and mouse interaction #4979
  • Improvement: whenever possible use cache for target transparency sampling #4955

[2.2.4]

  • Fix getPointer on touch devices #4866
  • Fix issues with selectionDashArray bleeding into free drawing #4894
  • Fix blur filter for nodejs #4905
  • Fix Register mousemove as non passive to help touch devices #4933
  • Fix modified shadow tosvg for safari compatibility #4934
  • Fix shader to avoid premultiplied alpha pixel getting dirty in blend filter #4936
  • Add isPartiallyOnScreen method #4856
  • Fix isEqual failing on array/null or objects/null/string compare #4949
  • Fix pencilBrush with alpha and with rerendering canvas #4938

[2.2.3]

  • improvement: Allow to parse quoted url string. url('#myid') #4881
  • improvement: text fromSVG import char-spacing attribute #3718
  • fix: text toSVG export with multiple spaces in safari #4880
  • fix: setSrc reset width and height on images #4877
  • improvements: Removed forced origin swap when rotating #4878
  • fix: Make the background of canvas cover all SVG in toSVG export #4852
  • fix: Added startAngle to cacheProperties for fabric.Circle #4875
  • fix: Rerender all the content of upperCanvas if canvas gets resized #4850
  • fix: Remove references to context when disposing #4846
  • improvements: Added single quoting to font names in toSVG #4840
  • improvements: Added reserved space to wrapLine functionality #4841

[2.2.2]

  • Fixed: Applying filters to an image will invalidate its cache #4828
  • Fixed: Attempt at fix font families that requires quoting #4831
  • Improvement: check upperCanvas client size for textarea position #4827
  • Fixed: Attempt to fix multiple touchends #4804
  • Fixed: Wrapping of textbox with charspacing #4803
  • Fixed: bad calculation of empty line in text (regression from 2.2.0) #4802

[2.2.1]

  • Reworked how amd and commonJS are together in the same file.

[2.2.0]

  • Fixed: super/sub script svg export #4780
  • Added: Text superScript and subScript support #4765
  • Fixed: negative kerning support (Pacifico font) #4772
  • Fixed: removing text on mousedown should be safe now #4774
  • Improved: pass to inner functions the parameter calculate coords in isOnscreen #4763

[2.1.0]

  • Added: Added: Drag and drop event binding #4421
  • Fixed: isEmptyStyle implementation for TextBox #4762

[2.0.3]

  • Fix: now sub target check can work with subclasses of fabric.Group #4753
  • Improvement: PencilBrush is now compexity 1 instead of complexity N during draw #4743
  • Fix the cleanStyle was not checking for the right property to exist #4751
  • Fix onBeforeScaleRotate with canvas zoom #4748

[2.0.2]

  • fixed image toSVG support for crop #4738
  • changed math for better rounded results #4734

[2.0.1]

  • fixed filter for blend image in WEBGL #4706
  • fixed interactions between canvas toDataURL and multiplier + retina #4705
  • fixed bug with originX and originY not invalidating the transform #4703
  • fixed unwanted mutation on object enliving in fabric.Image #4699

    [2.0.0]

  • final
    • fix dataurl and svg export on retina and rounding #4674
    • avoid error if iText is removed on mousedown #4650
    • fix calcOffset when text enter editing #4649
    • Gradient fix parsing floats #4637
    • Add CrossOrigin managment to fabric.Pattern #4618
    • Add patternTransform toObject saving #4626
    • normalize brushes render #4613
    • avoid charspacing shortcut #4594
    • Fix color toHexa() #4579
    • rc3 and rc4
    • more fixes to transformMatrix memoization
    • Canvas.selectionFullyContained allows you to select objects just when full grabbed by the selections. #4508
    • Remove some ouput of blank spaces from svg in order to avoid extra colored areas #4524
    • Reinserted a performance shortcut for when there is no style at all #4519
    • Manage canvas resize during a freedrawing brush without wiping the brush #4527
    • Removed an extra closePath that was creating wrong visual on IntelIntegrated cards #4549
    • Added a method to insert and remove text from command line #4541
    • Some fixes around text styles management
    • nodejs support changes: removed specific node code in order to use standard fabricjs code in nodejs.
    • added fabric.util.getNodeCanvas that passed a JSDOM element allows you to get the node-canvas instance behind it and do what you need.
    • rc2
    • Fixed a transform matrix memoize missing width/height #4491
    • Fix pattern drawing a point #4492
    • Fixed Text.removeChars #4495
    • Added back 2 node-canvas methods #4497
    • Fix a typo not restoring hoverCursor correctly.
    • rc1
    • Remove node specific code #4470
    • Improved Canvas.dispose code to leak less memory #4471
    • Remove extra padding of cache when upper limited #4467
    • Solved 2 perfomances problems with textbox #4466 #4465
    • Added justify-left justify-right and justify-center #4437
    • Fix Group fromObject and subTargetCheck #4454
    • Fix regression on IMG from SVG #4450
    • Remove cache dimensions together with canvas #4453
    • Fixed some fuzzyness cases for cache #4452
    • Fixed resize filter for webgl #4426
    • Stop searching target during a mouse move with a transform #4442
    • safeguard shaders for non supported precisions #4433
    • fix insert and remove style for edge cases #4420
    • Fix object.move when in active selection #4394
    • Memoize calcTransformMatrix function #4418
    • Make _set flag object as dirty just when a real change happen#4415
    • Add browserShadowBlurConstant to adjust shadowBlur value #4413
    • Fix set element not clearing the cacheTexture. #4410
    • Multi selection key can be configured with an array of keys. #4363
    • fix fast type in text loosing some style. #4339
    • fixed division by zero with lockscaling flip.
    • added paintFirst ( paint-order with svg support ) #4303
  • beta7
    • added a build flag for not attaching fabric to window #4199
    • removed .active property from objects #4200
    • Normalize Api for getSelectionStyles, setSelectionStyles #4202
    • Fix shader for convolute filter #4207
    • Better mouse support for lockscaling flip #4225
    • Fix toDataUrl getting a blank canvas #4229
    • Ouput version to json Objects #4251
    • Use backstoreOnly for toDataUrl resize #4254
    • Fix safari svg whitespace #4294
    • Fix Gradient export for paths #4274
    • Move mouseout/over in mousemove events #4283
    • Fix detection of click at the end of line #4295
    • added new event selection:updated #4311
    • Fixed free drawing path displacement #4311
    • Fixed scale equally and flipping not happening #4313
    • Select by drag makes the object fires 'selected' #4314
  • beta6
    • incompat: New filter system with WEBGL.
    • incompat: New Text/IText/Textbox code. Multibyte compatible, more accurate.
    • incompat: RequestAnimationFrame is used for the automatic render calls.
    • incompat: Named setter/getter are optional now.
    • incompat: Removed PathGroup class
    • incompat: Paths cannot be restored anymore from strings #3713
    • incompat: bumped node version to 4+ and jsdom to 9. #3717
    • incompat: removed the es5 / JSON shim support #3722
    • fix/incompat: IText setSelectionStyles does not change anymore style if no selection is present #3765
    • skipOffscreen default to true
    • Text.setSelectionStyle does not change anything if there is no selection #3765
    • Switch to canvas-prebuilt as dependency. Added parameter to choose the canvas package #3757
    • improvement: renderControls can now be called on its own. Added parameter styleOverride to allow for overriding current properties #3887
    • removed hasMoved and saveCoords from Group class #3910
    • forced all fromObject and fromElement to be async, normalized api. #3996
    • improvement: added support for request animation frame in mouse events #3997
    • added dblclick support for all objects #3998
    • textbox scale as a normal object #4052
    • Removed image meetOrSlice, alignX, alignY, introduced cropX, cropY #4055
    • Added Text.cleanStyle, Text.removeStyle #4060
    • change: lockRotation will not hide the mtr control anymore. introduced notAllowedCursor for canvas. #4064
    • improvement: added 2 percentage values to fabric.util.animate. #4068
    • change: pathOffset does not get exported anymore in path.toObject, toDatalessObject export sourcePath instead of modifying path. #4108

[1.7.19]

  • Fixed the flip of images with scale equally #4313
  • Improved touch detection #4302

[1.7.18]

  • Fixed doubling of subtargets for preserveObjectStacking = true #4297
  • Added a dirty set to objects in group destroy.

[1.7.17]

  • Change: swapped style white-space:nowrap with attribute wrap="off" since the style rule was creating problems in browsers like ie11 and safari. #4119
  • Fix: Remove an object from activeGroup if removed from canvas #4120
  • Fix: avoid bringFroward, sendBackwards to swap objects in active selections #4119
  • Fix: avoid disposing canvas on mouse event to throw error #4119
  • Fix: make svg respect white spaces #4119
  • Fix: avoid exporting bgImage and overlayImage if excludeFromExport = true #4119
  • Fix: Avoid group fromObject mutating original data #4111

[1.7.16]

  • improvement: added 2 percentage values to fabric.util.animate. #4068
  • Improvement: avoid multiplying identity matrices in calcTransformMatrix function
  • Fix: activeGroup did not destroy correctly if a toObject was happening
  • Improvement: Pass the event to object:modified when available. #4061

[1.7.15]

  • Improvement: Made iText keymap public. #4053
  • Improvement: Fix a bug in updateCacheCanvas that was returning always true #4051

[1.7.14]

  • Improvement: Avoid cache canvas to resize each mouse move step. #4037
  • Improvement: Make cache canvas limited in size. #4035
  • Fix: Make groups and statefull cache work. #4032
  • Add: Marked the hiddentextarea from itext so that custom projects can recognize it. #4022

[1.7.13]

  • Fix: Try to minimize delay in loadFroJson #4007
  • Fix: allow fabric.Color to parse rgba(x,y,z,.a) without leading 0 #4006
  • Allow path to execute Object.initialize, make extensions easier #4005
  • Fix: properly set options from path fromDatalessObjects #3995
  • Check for slice before action.slice. Avoid conflicts with heavy customized code. #3992

[1.7.12]

  • Fix: removed possible memleaks from window resize event. #3984
  • Fix: restored default cursor to noTarget only. unselectable objects get the standard hovercursor. #3953
  • Cache fixes: fix uncached pathGroup, removed cache creation at initialize time #3982
  • Improvement: nextTarget to mouseOut and prevTarget to mouseOver #3900
  • Improvement: add isClick boolean to left mouse up #3898
  • Fix: can start selection on top of non selectable object #3892
  • Improvement: better management of right/middle click #3888
  • Fix: subTargetCheck on activeObject/activeGroup was firing too many events #3909
  • Fix: After addWithUpdate or removeWithUpdate object coords must be updated. #3911

[1.7.11]

  • Hotfix: restore path-groups ability to render #3877

[1.7.10]

  • Fix: correct svg export for radial gradients #3807
  • Fix: Update fireout events to export the event object #3853
  • Fix: Improve callSuper to avoid infinite loops (not all of them) #3844
  • Fix: avoid selectionBackgroundColor leak on toDataUrl #3862
  • Fix: toDatelessObject for Group #3863
  • Improvement: better caching logic for groups #3864
  • Fix: correct svg gradient export for radial in polygons #3866
  • Fix: First draw could be empty for some objects #3870
  • Fix: Always send event data to object:selected #3871
  • Improvement: reduce angle calculation error #3872

[1.7.9]

  • Fix: Avoid textarea wrapping from chrome v57+ #3804
  • Fix: double click needed to move cursor when enterEditing is called programmatically #3804
  • Fix: Style regression when inputing new style objects #3804
  • Add: try to support crossOrigin for svg image tags #3804

[1.7.8]

  • Fix: Fix dirty flag propagation #3782
  • Fix: Path parsing error in bounding boxes of curves #3774
  • Add: Middle click mouse management on canvas #3764
  • Add: Add parameter to detect and skip offscreen drawing #3758
  • Fix: textarea loosing focus after a drag and exit from canvas #3759

[1.7.7]

  • Fix for opacity parsing in svg with nested opacities #3747
  • Fix text initialization and boundingrect #3745
  • Fix line bounding box #3742
  • Improvement: do not pollute style object while typing if not necessary #3743
  • fix for broken prototype chain when restoring a dataless object on fill an stroke #3735
  • fix for deselected event not fired on mouse actions #3716
  • fix for blurriness introduced on 1.7.3 #3721

[1.7.6]

  • Fix: make the cacheCanvas created on the fly if not available #3705

[1.7.5]

  • Improvement: draw textbackgroundColor in one single pass when possible @stefanhayden #3698
  • Improvement: fire selection changed event just if text is editing #3702
  • Improvement: Add object property 'needsItsOwnCache' #3703
  • Improvement: Skip unnecessary transform if they can be detected with a single if #3704

[1.7.4]

  • Fix: Moved all the touch event to passive false so that they behave as before chrome changes #3690
  • Fix: force top and left in the object representation of a path to avoid reparsing on restore #3691
  • Add: Enable deselected event for activeObject switch. Ensure deactivateAll call exitEditing #3689
  • Fix: Perform subtargetCheck also if the group is an active object and on activeGroup #3688
  • Fix: Made cursor operation more precise at high canvas zoom level #3671
  • Add: Made getBoundingRect available to return both absolute or standard bounding rect #3614
  • Add: Introduced calcViewportBoundaries() function for fabric.StaticCanvas #3614
  • Add: Introduced isOnScreen() function for fabric.Object #3614
  • Subclassed Polygon from polyline #3614
  • Fix: Removed reference to hovered target when target gets removed #3657
  • Fix: Removed hover cursor for non selectable objects #3643
  • Fix: Switch to passive event for touch move #3643
  • Fix: Restart rendering of cursor after entering some text #3643
  • Add: fabric.Color support toHexa() method now #3615

[1.7.3]

  • Improvement: mousewheel event is handled with target and fired also from objects. #3612
  • Improvement: Pattern loads for canvas background and overlay, corrected svg pattern export #3601
  • Fix: Wait for pattern loading before calling callback #3598
  • Fix: add 2 extra pixels to cache canvases to avoid aliasing cut #3596
  • Fix: Rerender when deselect an itext editing object #3594
  • Fix: save new state of dimensionProperties at every cache clear #3595
  • Improvement: Better error management in loadFromJSON #3586
  • Improvement: do not reload backgroundImage as an image if is different type #3550
  • Improvement: if a children element is set dirty, set the parent dirty as well. #3564

[1.7.2]

  • Fix: Textbox do not use stylemap for line wrapping #3546
  • Fix: Fix for firing object:modified in macOS sierra #3539
  • Fix: Itext with object caching was not refreshing selection correctly. #3538
  • Fix: stateful now works again with activeGroup and dinamyc swap between stateful false/true. #3537
  • Fix: includeDefaultValues was not applied to child objects of groups and path-groups. #3497
  • Fix: Itext style is cloned on paste action now, allow copy of styles to be independent. #3502
  • Fix: Add subclasses properties to cacheProperties. #3490
  • Add: Shift and Alt key used for transformations are now dynamic. #3479
  • Fix: fix to polygon and cache. Added cacheProperties for all classes #3490

[1.7.1]

  • Add: Gradients/Patterns support customAttributes in toObject method #3477
  • Fix: IText/Textbox not blurring keyboard on ios 10 #3476
  • Fix: Shadow on freedrawing and zoomed canvas #3475
  • Fix: Fix for group returning negative scales #3474
  • Fix: hotfix for textbox #3441#3473

[1.7.0]

  • Add: Object Caching #3417
  • Improvement: group internal objects have coords not affected by canvas zoom #3420
  • Fix: itext cursor trails on initDimension #3436
  • Fix: null check on .setActive #3435
  • Fix: function error in clone deep. #3434

[1.6.7]

  • Add: Snap rotation added to objects. two parameter introduced, snapAngle and snapTreshold. #3383
  • Fix: Pass target to right click event. #3381
  • Fix: Correct rendering of bg color for styled text and correct clearing of itext area. #3388
  • Add: Fire mouse:over on the canvas when we enter the canvas from outside the element. #3388
  • Fix: Fix calculation of words width with spaces and justify. #3408
  • Fix: Do not export defaults properties for bg and overlay if requested. #3415
  • Fix: Change export toObect to always delete default properties if requested. #3416

[1.6.6]

  • Add: Contrast and Saturate filters #3341
  • Fix: Correct registering and removal of events to handle iText objects. #3349
  • Fix: Corrected 2 regression of 1.6.5 (dataurl export and itext clicks)
  • Fix: Corrected path boundaries calculation for Arcs ( a and A ) #3347

[1.6.5]

  • Fix: charspacing, do not get subzero with charwidth.
  • Improvement: add callback support to all object cloning. #3212
  • Improvement: add backgroundColor to all class #3248
  • Fix: add custom properties to backgroundImage and overlayImage #3250
  • Fix: Object intersection is calculated on boundingBox and boundingRect, intersection is fired if objects are overlapping #3252
  • Change: Restored previous selection behaviour, added key to selection active object under overlaid target #3254
  • Improvement: hasStateChanged let you find state changes of complex properties. #3262
  • Fix: IText/Textbox shift click selection backward. #3270
  • Revert: font family quoting was a bad idea. node-canvas stills use it. #3276
  • Fix: fire mouse:over event for activeObject and activeGroup when using findTarget shourtcuts #3285
  • Fix: clear method clear all properties of canvas #3305
  • Fix: text area position method takes in account canvas offset #3306
  • Improvement: Added event on right click and possibility to hide the context menu with a flag 3308
  • Fix: remove canvas reference from object when object gets removed from canvas #3307
  • Improvement: use native stroke dash if available #3309
  • Fix: Export correct src when exporting to svg #3310
  • Fix: Stop text to go on zero dimensions #3312
  • Fix: Error in dataURL with multiplier was outputting very big canvas with retina #3314
  • Fix: Error in style map was not respecting style if textbox started with space #3315

[1.6.4]

  • Improvement: Ignore svg: namespace during svg import. #3081
  • Improvement: Better fix for lineHeight of iText/Text #3094
  • Improvement: Support for gradient with 'Infinity' coordinates #3082
  • Improvement: Generally "improved" logic of targeting #3111
  • Fix: Selection of active group with transparency and preserveObjectStacking true or false #3109
  • Fix: pattern brush now create the same pattern seen while drawing #3112
  • Fix: Allow css merge during svg import #3114
  • Improvement: added numeric origins handling fomr 0 to 1. #3121
  • Fix: Fix a defect with shadow of objects in a scaled group. #3134
  • Improvement: Do not fire unecessary selection:changed events. #3119
  • Fix: Attached hiddenTextarea to body fixes IE, thanks to @plainview. #3137
  • Fix: Shift unselect activegroup on transformed canvas. #3144
  • Added: ColorMatrix filter #3139
  • Fix: Fix condition in wich restoring from Object could cause object overwriting #3146
  • Change: cloneAsImage for Object and toDataUrl for object are not retina enabled by default. Added option to enable. #3147
  • Improvement: Added textSpacing support for text/itext/textbox #3097
  • Fix: Quote font family when setting the context fontstyle #3191
  • Fix: use getSrc during image export, make subclassing easier, return eventually the .src property if nothing else is available #3189
  • Fix: Inverted the meaning of border scale factor #3154
  • Improvement: Added support for RGBA in HEX notation. #3202
  • Improvement: Added object deselected event. #3195
  • Fix: loadFromJson callback now gets fired after filter are applied #3210

[1.6.3]

  • Improvement: Use reviver callback for background and overlay image when doing svg export. #2975
  • Improvement: Added object property excludeFromExport to avoid exporting the object to JSON or to SVG. #2976
  • Improvement: Correct the calculation of text boundingbox. Improves svg import #2992
  • Added: Export id property to SVG #2993
  • Improvement: Call the callback on loadSvgFromURL on failed xml load with null agument #2994
  • Improvement: Clear only the Itext area on contextTop during cursor animation #2996
  • Added: Char widths cache has been moved to fabric level and not iText level. Added fabric.util.clearFabricCharWidthsCache(fontName) #2995
  • Fix: do not set background or overlay image if the url load fails. #3003
  • Fix: iText mousemove event removal, clear the correct area for Itext, stopped redrawing selection if not necessary #3016
  • Fix: background image and overlay image scale and move with canvas viewportTransform, parameter available #3019
  • Added: support sub targeting in groups in events #2997
  • Fix: Select transparent object on mouse up because of _maybeGroupObject #2997
  • Fix: Remove reference to lastRenderedObject on canvas.remove #3023
  • Fix: Wait for all objects to be loaded before deleting the properties and setting options. #3029
  • Fix: Object Padding is unaffected by object transform. #3057
  • Fix: Restore lastRenderedObject usage. Introduced Canvas.lastRenderedKey to retrieve the lastRendered object from down the stack #3057
  • Fix: _calcTextareaPosition correctly calculate the position considering the viewportTransform. #3057
  • Fix: Fixed selectionBacgroundColor with viewport transform. #3057
  • Improvement: Correctly render the cursor with viewport scaling, improved the cursor centering. #3057
  • Fix: Use canvas zoom and pan when using is target transparent. #2980

[1.6.2]

  • Fix: restore canvas properties on loadFromJSON with includeProperties. #2921
  • Fix: Allow hoverCursor on non selectable objects, moveCursor does not appear if the object is not moveable. Added object.moveCursor to specify a cursor for moving per object. #2924
  • Fix: Add missing stroke.live translation, allow gradientTransform for dashed line. #2926
  • Improvement: Allow customization of keys that iteract with mouse action ( multiselect key, free transform key, alternative action key, centered transform key ) #2925
  • Added: Make iText fires object:modified on text change on exit editing #2927
  • Added: [control customization part 1] cornerDashArray, borderDashArray. Now borderScaleFactor influences both border and controls, changed default corner size to 13 #2932
  • Fix: createSVGFontFacesMarkup was failing to retrieve fonts in style #2935
  • Fix: shadow not scaled with dataUrl to multiplier #2940
  • Added: [control customization part 2] cornerStrokeColor. Now is possible to specify separate stroke and fill color for the controls #2933
  • Fix: Itext width calculation with caching false was returning nan. #2943
  • Added: [control customization part 3] Rounded corners. It is possible to specify cornerStyle for the object. 'rect' or 'circle' #2942
  • Added: [control customization part 4] Selection background. It is possible to specify selectionBackgroundColor for the object. #2950
  • Fix: Behaviour of image with filters with resize effects and Object to/from json #2954
  • Fix: Svg export should not output color notation in rgba format #2955
  • Fix: minScaleLimit rounding bug #2964
  • Fix: Itext spacing in justify mode bug #2971
  • Fix: Object.toDataUrl export when some window.devicepixelRatio is present (retina or browser zoom) #2972

[1.6.1]

  • Fix: image with broken element throwing error on toObject() #2878
  • Fix: Warning on trying to set proprietary browser version of ctxImageSmoothingEnabled #2880
  • Fix: Fixed Svg import regression on color and drawing polylines #2887
  • Fix: Fixed animation ease that starts and stop at same value #2888
  • Fix: Allow a not stateful canvas to fire object:modified at end of transform. #2890
  • Fix: Made event handler removal safer. Removing firing events will not cause errors. #2883
  • Fix: Proper handling of perPixelTargetFind and multi selections #2894
  • Fix: Do not clear contextTop on drawingMode, to allow drawing over animations #2895
  • Change the dependencies to optional. Allow npm to continue installing if nodecanvas installation fail.#2901
  • Fix: Check again the target on mouseup #2902
  • Fix: On perPixelTargetFind detect corners only if target is active #2903
  • Improvement: Add canvas mouseout event listener #2907
  • Improvement: Make small object draggable easier #2907
  • Improvement: Use sendToBack, bringToFront, bringForward, sendBackwards for multiple selections #2908

[1.6.0]

  • Fix rendering of activeGroup objects while preserveObjectStacking is active. [ regression from #2083 ]
  • Fix fabric.Path initialize with user options #2117
  • Fix sorting of objects in activeGroup during rendering #2130.
  • Make sure that 'object.canvas' property is always set if the object is directly or indirectly on canvas #2141
  • Fix _getTopLeftCoords function that was returning TopCenter #2127
  • Fix events not being fired after resize with pinch zoom #510
  • Fix mouse:over, mouse:out events not receiving event object #2146
  • Don't include elements from <metadata> during SVG parsing #2160
  • Fix some iText new glitches and old bugs about style deleting and inserting, faster function for get2dCursorLocation #2153
  • Change bounding box calculation, made strokewidth always considered in dimensions. Switched group stroke default to 0 strokewidth. #2155
  • Fix scaling function for object with strokewidth #2178
  • Fix image fromObject restoring resizeFilter #2164
  • Fix double application of filter upon image init #2164
  • Fix image.filter.Resize toObject and fromObject #2164
  • Fix strokeWidth calculation during resize operations #2178
  • Fix iText selection on upperCanvas to support transformMatrix #2173
  • Removed unnecessary calls to removeShadow and restoreGlobalCompositeOperation #2175
  • Fix the offset for pattern and gradients filling and stroking in text #2183
  • Fix loading of stroke gradients from Object #2182
  • Fix segmentation fault on node.js when image doesn't exist #2193
  • Fix iText border selection when changing fontWeight #2201
  • Fix calculation of object dimensions for geometry functions translation and scaling. #2206
  • Fix iText cursor position on click at end of line #2217
  • Fix error on parsing style string with trailing spaces #2256
  • Fix delegated properties leaking on objects in a group when restoring from json #2101
  • Fix cursor click position in rotated i-Text when origins different from TOPLEFT. #2269
  • Fix mouse position when the canvas is in a complex style scrolling situation #2128
  • Fix parser regex for not parsing svg tags attribute #2311
  • Add id attribute to standard attribute parsing from SVG elements #2317
  • Fix text decoration opacity #2310
  • Add simple color animation utility in /src/util/animate_color.js #2328
  • Fix itext paste function to check for source of copied text and strip carriage returns (\r)#2336
  • Fix pattern class serialize the source using toDataURL if available #2335
  • Fix imageSmoothingEnabled warning on chrome and reinit the property after setDimensions #2337
  • Add ability to parse path elements with no path specified. #2344
  • Fix shiftClick with activeGroup in case of normal and scaled groups #2342
  • Add support for colors in shadow svg export #2349
  • Add support for inner viewBoxes in svg parsing #2345
  • Fix BoundingBox calculation for pathGroups that have inner transformMatrix #2348
  • Fix export toObject to include transformMatrix property #2350
  • Fix textbox class to supporto toSVG() and newest style fixes [#2347] (https://github.com/kangax/fabric.js/pull/2347)
  • Fix regression on text ( textDecoration and textlinebackground ) #2354
  • Add support for multi keys chars using onInput event #2352
  • Fix iText and textbox entering in edit mode if clicked on a corner #2393
  • Fix iText styles error when in justify align #2370
  • Add support for shadow export in svg for groups, pathgroups and images. [#2364]
  • Add rendering shadows for groups #2364
  • Add support for parsing nested SVGs x and y attributes #2399
  • Add support for gradientTransform in setGradient(fill or stroke) #2401
  • Fix Error in svg parsed that was stopping on gradient color-stop missing stop attribute #2414
  • toObject method return copied arrays for array like properties #2407
  • Fix Set stop value of colorstop to 0 if stop attribute not present #2414
  • Fix correct value of e.button for mouse left click if e.which not supported#2453
  • Add check for host property in getScrollTopLeft#2462
  • Fix check for object.selectable in findTarget#2466
  • Fix After rendering a gesture set originX/Y to its original value#2479
  • Add support for skewing objects using shift and m-controls in interactive mode, and using object.skewX/Y #2482
  • Fix gradientTransform not exported in gradient toObject #2486
  • Fix object.toDataUrl with multiplier #2487 BACK INCOMPATIBILITY: removed 'allOnTop' parameter from fabric.StaticCanvas.renderAll.
  • Fix mask filter, mask image is now streched on all image #2543
  • Fix text onInput event to behave correctly if some text is selected #2501
  • Fix object with selectable = false could be selected with shift click #2503
  • Fix for mask filter when bigger or smaller image is used #2534
  • Improvement: simplified renderAll logic #2545
  • Improvement: Manage group transformation with skew rotate and scale #2549
  • Fix: Add shadow affectStroke to shadow to Object method #2568
  • Fix: Made multitouch pinch resize works with skewed object #2625
  • Improvement: Added retina screen support #2623
  • Change: Set default Image strokeWidth to 0 to improve image rendering #2624
  • Fix: multitouch zoom gesture speed back to normal speed #2625
  • Fix: fix controls rendering with retina scaling and controls above overlay #2632
  • Improvements: resize SVG using viewport/viewbox. #2642
  • Improvements: Svg import now supports rotate around point #2645
  • Change: Opacity is no more a delegated property for group #2656
  • Fix: Itext now check for editable property before initializing cursor #2657
  • Fix: Better SVG export support for shadows of rotated objects #2671
  • Fix: Avoid polygon polyline to change constructor point array #2627
  • SVG import: support fill/stroke opacity when no fill/stroke attribute is present #2703
  • Fix: remove white filter set opacity to 0 instead of 1 #2714
  • Cleaning: removing unused fabric.Canvas.activeInstance #2708
  • Change: remove flipping of text string when flipping object #2719
  • Fix: Correct shift click on generic transformerd active groups #2720
  • SVG import: parse svg with no spaces between transforms #2738
  • Fix: Fallback to styleElement.text for IE9 #2754
  • Fix: data url for node #2777
  • Improvement: Extended font face to all text class during svg export #2797
  • Fix: retina scaling dataurl and shadows. #2806
  • Improvement: Better look to iText decoration shadows. #2808
  • Improvement: New text shadow export to SVG. #2827
  • fix: location of optimized 1x1 rects. #2817
  • fix: TextBox handling of consecutive spaces. #2852
  • fix: Respect shadow in svg export of flipped objects. #2854
  • fix: Check presence of style for textBox in svg export. #2853
  • Improvement: Added node compatibility for v4 and v5. #2872
  • Fix: Canvas dispose remove the extra created elements. #2875
  • IText improvements to cut-copy-paste, edit, mobile jumps and style. #2868

[1.5.0]

Edge

  • Added image preserve aspect ratio attributes and functionality (fabric.Image.alignY, fabric.Image.alignY, fabric.Image.meetOrSlic )
  • Added ImageResizeFilters , option to resize dynamically or statically the images using a set of resize filter alghoritms.
  • [BACK_INCOMPAT] fabric.Collection#remove doesn't return removed object -> returns this (chainable)

  • Add "mouse:over" and "mouse:out" canvas events (and corresponding "mouseover", "mouseout" object events)

  • Add support for passing options to fabric.createCanvasForNode

  • Various iText fixes and performance improvements

  • Fix overlayImage / overlayColor during selection mode
  • Fix double callback in loadFromJSON when there's no objects
  • Fix paths parsing when number has negative exponent
  • Fix background offset in iText
  • Fix style object deletion in iText
  • Fix typo in _initCanvasHandlers
  • Fix transformMatrix not affecting fabric.Text
  • Fix setAngle for different originX/originY (!= 'center')
  • Change default/init noise/brightness value for fabric.Image.filters.Noise and fabric.Image.filters.Brightness from 100 to 0
  • Add fabric.Canvas#imageSmoothingEnabled
  • Add copy/paste support for iText (uses clipboardData)

[1.4.0]

  • [BACK_INCOMPAT] JSON and Cufon are no longer included in default build

  • [BACK_INCOMPAT] Change default objects' originX/originY to left/top

  • [BACK_INCOMPAT] fabric.StaticCanvas#backgroundImage and fabric.StaticCanvas#overlayImage are fabric.Image instances. fabric.StaticCanvas#backgroundImageOpacity, fabric.StaticCanvas#backgroundImageStretch, fabric.StaticCanvas#overlayImageLeft and fabric.StaticCanvas#overlayImageTop were removed.

  • [BACK_INCOMPAT] fabric.Text#backgroundColor is now fabric.Object#backgroundColor

  • [BACK_INCOMPAT] Remove fabric.Object#toGrayscale and fabric.Object#overlayFill since they're too specific

  • [BACK_INCOMPAT] Remove fabric.StaticCanvas.toGrayscale since we already have that logic in fabric.Image.filters.Grayscale.

  • [BACK_INCOMPAT] Split centerTransform into the properties centeredScaling and centeredRotation. Object rotation now happens around originX/originY point UNLESS centeredRotation=true. Object scaling now happens non-centered UNLESS centeredScaling=true.

[1.3.0]

  • [BACK_INCOMPAT] Remove selectable, hasControls, hasBorders, hasRotatingPoint, transparentCorners, perPixelTargetFind from default object/json representation of objects.

  • [BACK_INCOMPAT] Object rotation now happens around originX/originY point UNLESS centerTransform=true.

  • [BACK_INCOMPAT] fabric.Text#textShadow has been removed - new fabric.Text.shadow property (type of fabric.Shadow).

  • [BACK_INCOMPAT] fabric.BaseBrush shadow properties are combined into one property => fabric.BaseBrush.shadow (shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY no longer exist).

  • [BACK_INCOMPAT] fabric.Path.fromObject is now async. fabric.Canvas#loadFromDatalessJSON is deprecated.

[1.2.0]

  • [BACK_INCOMPAT] Make fabric.Object#toDataURL synchronous.

  • [BACK_INCOMPAT] fabric.Text#strokeStyle -> fabric.Text#stroke, for consistency with other objects.

  • [BACK_INCOMPAT] fabric.Object.setActive(…) -> fabric.Object.set('active', …).

              `fabric.Object.isActive` is gone (use `fabric.Object.active` instead)
  • [BACK_INCOMPAT] fabric.Group#objects -> fabric.Group._objects.

[1.1.0]

  • [BACK_INCOMPAT] fabric.Text#setFontsize becomes fabric.Object#setFontSize.

  • [BACK_INCOMPAT] fabric.Canvas.toDataURL now accepts options object instead linear arguments.

              `fabric.Canvas.toDataURLWithMultiplier` is deprecated;
              use `fabric.Canvas.toDataURL({ multiplier: … })` instead

[1.0.0]