SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Downloaden Sie, um offline zu lesen
fabric.js
Building a canvas library




       Warsaw   2011
who is kangax?
     kangax.com
who is kangax?

perfectionkills.com                 ES5 compat tables


                      fabric.js


                      Common Feature Tests
                                              PrototypeJS

HTML minifier                                  DOMLint
Game Plan

History
Why fabric?
How it works. Features.
Canvas libraries
Future plans
History
 printio.ru
History
 printio.ru



        All Javascript, no Flash
        Free drawing
        Vectors & images
        Performance
Canvas vs SVG
Why fabric?
 Canvas API sucks is too low level

There was an excruciating need for
     interactive object model
       for canvas element
Why fabric?
native
 var canvasEl = document.getElementById('canvas');
 var ctx = canvasEl.getContext('2d');
 ctx.strokeStyle = '';
 ctx.fillStyle = 'red';
 ctx.fillRect(100, 100, 20, 20);




fabric

 var canvas = new fabric.Element('canvas');

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

 canvas.add(rect);
Why fabric?
native

 var canvasEl = document.getElementById('canvas');
 var ctx = canvasEl.getContext('2d');
 ctx.strokeStyle = '';
 ctx.fillStyle = 'red';
 ctx.save();
 ctx.translate(100, 100);
 ctx.rotate(Math.PI / 180 * 45);
 ctx.fillRect(-10, -10, 20, 20);
 ctx.restore();


fabric

 var canvas = new fabric.Element('canvas');

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

 canvas.add(rect);
Why fabric?
native

ctx.fillRect(20, 50, 20, 20);




fabric
rect.set(‘left’, 20).set(‘top’, 50);
canvas.renderAll();
Why fabric?
native

ctx.fillRect(20, 50, 20, 20);

ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.fillRect(20, 50, 20, 20);




fabric
rect.set(‘left’, 20).set(‘top’, 50);
canvas.renderAll();
Demo




http://kangax.github.com/fabric.js/test/demo
Under the hood
Upper <canvas>
Group selection




                                   Lower <canvas>
                                     All objects
Under the hood
                                   fabric.Circle
   fabric.Rect                               render()
        render()




fabric.Element
      renderAll()
                          fabric.Triangle
                                  render()
Under the hood
                                        fabric.Circle
    fabric.Rect                                   render()
          render()




fabric.Element                 fabric.Triangle
       renderAll()
                                       render()
Under the hood
     Root “class”. 2D objects           Concrete “subclasses”


fabric.Object                   fabric.Line
                                fabric.Circle
                                fabric.Triangle
                                fabric.Ellipse
              Container
                                fabric.Rect
fabric.Element                  fabric.Polyline
                                fabric.Polygon
                                fabric.Group                    fabric.Color
                                fabric.Text                     fabric.Point
                                fabric.Image                    fabric.Intersection
                                fabric.Path
Under the hood
                                clone
                                cloneAsImage
     Root “class”. 2D objects   complexity      Inherited by all subclasses
                                get
fabric.Object                   getCenter
                                getWidth
                                getElement
                                getHeight
                                intersectsWithObject
                                isActive
                                isType
                                scale
                                scaleToHeight
                                scaleToWidth
                                set
                                setActive
                                setElement
                                straighten
                                toDataURL
                                toJSON
                                toGrayscale
                                ...
Features — Animation
                      fxCenterObjectV: function (...) {
fabric.util.animate     ...

                          fabric.util.animate({

                            startValue: object.get('top'),
                            endValue: this.getCenter().top,

                            duration: this.FX_DURATION,

                            onChange: function(value) {
                               object.set('top', value);
                               _this.renderAll();
                               onChange();
fxCenterObjectV             },
                            onComplete: function() {
fxCenterObjectH                object.setCoords();
                               onComplete();
fxStraightenObject          }
                          });

fxRemove                  ...
                      }
...
Features — Animation
Or just use new, fancy window.requestAnimationFrame

                        (function animate() {
                          canvas.forEachObject(function(obj) {
                            obj.left += (obj.movingLeft ? -1 : 1);
                            obj.top += 1;
                            if (obj.left > 900 || obj.top > 500) {
                              canvas.remove(obj);
                            }
                            else {
                              obj.setAngle(obj.getAngle() + 2);
                            }
                          });
                          canvas.renderAll();
                          window.requestAnimationFrame(animate);
                        })();
Features — Events
object:scaled
object:selected          fabric.util.observeEvent('object:moved', function(e) {

object:moved               var activeObject = e.memo.target;

                           console.log(activeObject.left, activeObject.top);

group:modified           });

group:selected
before:group:destroyed
after:group:destroyed


mouse:up


selection:cleared              Will be made more consistent!
path:created
Features — Text
fontsize
                     var myText = new fabric.Text('Hello world', {
font weight
                      fontfamily: 'delicious'
fontfamily
                     });
fontStyle
                     canvas.add(myText);


textDecoration
textShadow


lineHeight
backgroundColor


strokeStyle                Will be made more consistent!
strokeWidth
Features — Text
Multiline support




                    text aligning coming soon
Features — Text
Multiline support
Relies on Cufon.js




http://kangax.github.com/jstests/canvas_fillText_test
Features — Text
       Multiline support
       Relies on Cufon.js
       Renders using any
       OTF, TTF, etc. font



Each font is a JS file with glyph definitions
Features — SVG Parser

  Q:   How to render SVG shapes on canvas?
       A:   Transform them to fabric objects.
Features — SVG Parser



<path d="M-122.304 84.285C-122.304            {
84.285 -122.203 86.179 -123.027      Step 1       path: [
86.16C-123.851 86.141 -140.305                      [ "M", -122.304, 84.285 ],
38.066 -160.833 40.309C-160.833                     [ "C", -122.304, 84.285,
40.309 -143.05 32.956 -122.304                             -122.203, 86.179,
84.285z" />
                                                             -123.027, 86.16 ],
                                                      [ "C", -123.851, ... ],
                                                      [ ... ],
                                                      ...
                                                  ]
                                              }
Features — SVG Parser



{                                            case 'C': // bezierCurveTo, absolute
    path: [                                    x = current[5];
      [ "M", -122.304, 84.285 ],               y = current[6];
      [ "C", -122.304, 84.285,      Step 2     controlX = current[3];
             -122.203, 86.179,                 controlY = current[4];
                                               ctx.bezierCurveTo(
               -123.027, 86.16 ],                 current[1] + l,
        [ "C", -123.851, ... ],                   current[2] + t,
        [ ... ],                                  controlX + l,
        ...                                       controlY + t,
    ]                                             x + l,
}                                                 y + t
                                               );
                                               break;
Canvas libraries



   http://goo.gl/CCRRT
Canvas libraries




  canvg
   The only other library with (good) SVG parser
   But no object model
Canvas libraries




  burst
   Lots of features but completely abandoned
Canvas libraries




  Unit Tests
   Hard to come across a library that has them
Canvas libraries




    easel.js
    Probably the most active, similar, and
    promising alternative.
    But no unit tests or SVG parser :(
Fabric use cases
                 mouse-based interactions built in


Collages
                           might be overkill for static charts

Basic games
Charts
Basic drawing (paintbrush, diagrams)
Display SVG where unsupported (Android)
What can you build?
     mustachified.com
Future plans

Smaller footprint
Better docs, tutorials
Custom builder
fabric-to-SVG
Touch compatible (iOS)
Smaller footprint

        Fabric 0.2.5                     jQuery 1.6.1

102 KB — minified                 91 KB — minified
 33 KB — minified + compressed    32 KB — minified + compressed



Can do even better – optional json2.js, cufon.js + custom builder
Smaller footprint
          with Cufon                              without cufon.js

 102 KB — minified                            86 KB — minified
  33 KB — minified + compressed               29 KB — minified + compressed




                                                  without json2.js

JSON missing in FF 3, SF 3.2, OP 10.1, IE 7    82 KB — minified
                                              25 KB — minified + compressed
Docs, Tests
                                  1000+ tests ATM




        http://kangax.github.com/fabric.js/docs

http://kangax.github.com/fabric.js/test/unit/suite_runner
Demos, Benchmarks




 http://kangax.github.com/fabric.js/test/
     raphael_vs_fabric/complex_shape


 http://kangax.github.com/fabric.js/demos
Supported browsers

Firefox 2+
Safari 3+ (& Mobile Safari)
Opera 9.64+
Chrome (all versions should work)
IE9+ (IE7 & 8 via excanvas.js)
Thank you!
                   Questions?


             http://spkr8.com/t/7582




github.com/kangax/fabric.js
                  @fabric.js
                  @kangax

Weitere ähnliche Inhalte

Was ist angesagt?

Advanced Javascript
Advanced JavascriptAdvanced Javascript
Advanced Javascript
Adieu
 

Was ist angesagt? (20)

Learning jQuery in 30 minutes
Learning jQuery in 30 minutesLearning jQuery in 30 minutes
Learning jQuery in 30 minutes
 
Best Practices in Qt Quick/QML - Part I
Best Practices in Qt Quick/QML - Part IBest Practices in Qt Quick/QML - Part I
Best Practices in Qt Quick/QML - Part I
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
Design pattern cheat sheet
Design pattern cheat sheetDesign pattern cheat sheet
Design pattern cheat sheet
 
Clean code in JavaScript
Clean code in JavaScriptClean code in JavaScript
Clean code in JavaScript
 
Advanced Javascript
Advanced JavascriptAdvanced Javascript
Advanced Javascript
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
 
Best Practices in Qt Quick/QML - Part 4
Best Practices in Qt Quick/QML - Part 4Best Practices in Qt Quick/QML - Part 4
Best Practices in Qt Quick/QML - Part 4
 
동시성 프로그래밍 하기 좋은 Clojure
동시성 프로그래밍 하기 좋은 Clojure동시성 프로그래밍 하기 좋은 Clojure
동시성 프로그래밍 하기 좋은 Clojure
 
Introduction to react and redux
Introduction to react and reduxIntroduction to react and redux
Introduction to react and redux
 
React js
React jsReact js
React js
 
React
React React
React
 
02 - Basics of Qt
02 - Basics of Qt02 - Basics of Qt
02 - Basics of Qt
 
Angular
AngularAngular
Angular
 
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous Javascript
 
Phpconf 2013 - Agile Telephony Applications with PAMI and PAGI
Phpconf 2013 - Agile Telephony Applications with PAMI and PAGIPhpconf 2013 - Agile Telephony Applications with PAMI and PAGI
Phpconf 2013 - Agile Telephony Applications with PAMI and PAGI
 
Jquery
JqueryJquery
Jquery
 
Understanding react hooks
Understanding react hooksUnderstanding react hooks
Understanding react hooks
 

Ähnlich wie Fabric.js @ Falsy Values

asmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docx
asmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docxasmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docx
asmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docx
fredharris32
 
WPF L02-Graphics, Binding and Animation
WPF L02-Graphics, Binding and AnimationWPF L02-Graphics, Binding and Animation
WPF L02-Graphics, Binding and Animation
Mohammad Shaker
 
CodeMash - Building Rich Apps with Groovy SwingBuilder
CodeMash - Building Rich Apps with Groovy SwingBuilderCodeMash - Building Rich Apps with Groovy SwingBuilder
CodeMash - Building Rich Apps with Groovy SwingBuilder
Andres Almiray
 
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficientTh 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Bin Shao
 

Ähnlich wie Fabric.js @ Falsy Values (20)

jQuery
jQueryjQuery
jQuery
 
Hidden Gems in Swift
Hidden Gems in SwiftHidden Gems in Swift
Hidden Gems in Swift
 
asmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docx
asmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docxasmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docx
asmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docx
 
Building mobile web apps with Mobello
Building mobile web apps with MobelloBuilding mobile web apps with Mobello
Building mobile web apps with Mobello
 
Backbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The BrowserBackbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The Browser
 
HTML 5_Canvas
HTML 5_CanvasHTML 5_Canvas
HTML 5_Canvas
 
Intro to HTML5 Canvas
Intro to HTML5 CanvasIntro to HTML5 Canvas
Intro to HTML5 Canvas
 
WPF L02-Graphics, Binding and Animation
WPF L02-Graphics, Binding and AnimationWPF L02-Graphics, Binding and Animation
WPF L02-Graphics, Binding and Animation
 
ES6 Overview
ES6 OverviewES6 Overview
ES6 Overview
 
SVGo: a Go Library for SVG generation
SVGo: a Go Library for SVG generationSVGo: a Go Library for SVG generation
SVGo: a Go Library for SVG generation
 
Svcc Building Rich Applications with Groovy's SwingBuilder
Svcc Building Rich Applications with Groovy's SwingBuilderSvcc Building Rich Applications with Groovy's SwingBuilder
Svcc Building Rich Applications with Groovy's SwingBuilder
 
SVGo workshop
SVGo workshopSVGo workshop
SVGo workshop
 
Prototype Framework
Prototype FrameworkPrototype Framework
Prototype Framework
 
Cocoa Design Patterns in Swift
Cocoa Design Patterns in SwiftCocoa Design Patterns in Swift
Cocoa Design Patterns in Swift
 
jQuery
jQueryjQuery
jQuery
 
CodeMash - Building Rich Apps with Groovy SwingBuilder
CodeMash - Building Rich Apps with Groovy SwingBuilderCodeMash - Building Rich Apps with Groovy SwingBuilder
CodeMash - Building Rich Apps with Groovy SwingBuilder
 
Idioms in swift 2016 05c
Idioms in swift 2016 05cIdioms in swift 2016 05c
Idioms in swift 2016 05c
 
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficientTh 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
 
2008 Sccc Inheritance
2008 Sccc Inheritance2008 Sccc Inheritance
2008 Sccc Inheritance
 
Swift Tableview iOS App Development
Swift Tableview iOS App DevelopmentSwift Tableview iOS App Development
Swift Tableview iOS App Development
 

Kürzlich hochgeladen

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Kürzlich hochgeladen (20)

AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 

Fabric.js @ Falsy Values

  • 1. fabric.js Building a canvas library Warsaw 2011
  • 2. who is kangax? kangax.com
  • 3. who is kangax? perfectionkills.com ES5 compat tables fabric.js Common Feature Tests PrototypeJS HTML minifier DOMLint
  • 4. Game Plan History Why fabric? How it works. Features. Canvas libraries Future plans
  • 6. History printio.ru All Javascript, no Flash Free drawing Vectors & images Performance
  • 8. Why fabric? Canvas API sucks is too low level There was an excruciating need for interactive object model for canvas element
  • 9. Why fabric? native var canvasEl = document.getElementById('canvas'); var ctx = canvasEl.getContext('2d'); ctx.strokeStyle = ''; ctx.fillStyle = 'red'; ctx.fillRect(100, 100, 20, 20); fabric var canvas = new fabric.Element('canvas'); var rect = new fabric.Rect({ top: 100, left: 100, fill: 'red', width: 20, height: 20 }); canvas.add(rect);
  • 10. Why fabric? native var canvasEl = document.getElementById('canvas'); var ctx = canvasEl.getContext('2d'); ctx.strokeStyle = ''; ctx.fillStyle = 'red'; ctx.save(); ctx.translate(100, 100); ctx.rotate(Math.PI / 180 * 45); ctx.fillRect(-10, -10, 20, 20); ctx.restore(); fabric var canvas = new fabric.Element('canvas'); var rect = new fabric.Rect({ top: 100, left: 100, fill: 'red', width: 20, height: 20, angle: 45 }); canvas.add(rect);
  • 11. Why fabric? native ctx.fillRect(20, 50, 20, 20); fabric rect.set(‘left’, 20).set(‘top’, 50); canvas.renderAll();
  • 12. Why fabric? native ctx.fillRect(20, 50, 20, 20); ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.fillRect(20, 50, 20, 20); fabric rect.set(‘left’, 20).set(‘top’, 50); canvas.renderAll();
  • 14. Under the hood Upper <canvas> Group selection Lower <canvas> All objects
  • 15. Under the hood fabric.Circle fabric.Rect render() render() fabric.Element renderAll() fabric.Triangle render()
  • 16. Under the hood fabric.Circle fabric.Rect render() render() fabric.Element fabric.Triangle renderAll() render()
  • 17. Under the hood Root “class”. 2D objects Concrete “subclasses” fabric.Object fabric.Line fabric.Circle fabric.Triangle fabric.Ellipse Container fabric.Rect fabric.Element fabric.Polyline fabric.Polygon fabric.Group fabric.Color fabric.Text fabric.Point fabric.Image fabric.Intersection fabric.Path
  • 18. Under the hood clone cloneAsImage Root “class”. 2D objects complexity Inherited by all subclasses get fabric.Object getCenter getWidth getElement getHeight intersectsWithObject isActive isType scale scaleToHeight scaleToWidth set setActive setElement straighten toDataURL toJSON toGrayscale ...
  • 19. Features — Animation fxCenterObjectV: function (...) { fabric.util.animate ... fabric.util.animate({ startValue: object.get('top'), endValue: this.getCenter().top, duration: this.FX_DURATION, onChange: function(value) { object.set('top', value); _this.renderAll(); onChange(); fxCenterObjectV }, onComplete: function() { fxCenterObjectH object.setCoords(); onComplete(); fxStraightenObject } }); fxRemove ... } ...
  • 20. Features — Animation Or just use new, fancy window.requestAnimationFrame (function animate() { canvas.forEachObject(function(obj) { obj.left += (obj.movingLeft ? -1 : 1); obj.top += 1; if (obj.left > 900 || obj.top > 500) { canvas.remove(obj); } else { obj.setAngle(obj.getAngle() + 2); } }); canvas.renderAll(); window.requestAnimationFrame(animate); })();
  • 21. Features — Events object:scaled object:selected fabric.util.observeEvent('object:moved', function(e) { object:moved var activeObject = e.memo.target; console.log(activeObject.left, activeObject.top); group:modified }); group:selected before:group:destroyed after:group:destroyed mouse:up selection:cleared Will be made more consistent! path:created
  • 22. Features — Text fontsize var myText = new fabric.Text('Hello world', { font weight fontfamily: 'delicious' fontfamily }); fontStyle canvas.add(myText); textDecoration textShadow lineHeight backgroundColor strokeStyle Will be made more consistent! strokeWidth
  • 23. Features — Text Multiline support text aligning coming soon
  • 24. Features — Text Multiline support Relies on Cufon.js http://kangax.github.com/jstests/canvas_fillText_test
  • 25. Features — Text Multiline support Relies on Cufon.js Renders using any OTF, TTF, etc. font Each font is a JS file with glyph definitions
  • 26. Features — SVG Parser Q: How to render SVG shapes on canvas? A: Transform them to fabric objects.
  • 27. Features — SVG Parser <path d="M-122.304 84.285C-122.304 { 84.285 -122.203 86.179 -123.027 Step 1 path: [ 86.16C-123.851 86.141 -140.305 [ "M", -122.304, 84.285 ], 38.066 -160.833 40.309C-160.833 [ "C", -122.304, 84.285, 40.309 -143.05 32.956 -122.304 -122.203, 86.179, 84.285z" /> -123.027, 86.16 ], [ "C", -123.851, ... ], [ ... ], ... ] }
  • 28. Features — SVG Parser { case 'C': // bezierCurveTo, absolute path: [ x = current[5]; [ "M", -122.304, 84.285 ], y = current[6]; [ "C", -122.304, 84.285, Step 2 controlX = current[3]; -122.203, 86.179, controlY = current[4]; ctx.bezierCurveTo( -123.027, 86.16 ], current[1] + l, [ "C", -123.851, ... ], current[2] + t, [ ... ], controlX + l, ... controlY + t, ] x + l, } y + t ); break;
  • 29. Canvas libraries http://goo.gl/CCRRT
  • 30. Canvas libraries canvg The only other library with (good) SVG parser But no object model
  • 31. Canvas libraries burst Lots of features but completely abandoned
  • 32. Canvas libraries Unit Tests Hard to come across a library that has them
  • 33. Canvas libraries easel.js Probably the most active, similar, and promising alternative. But no unit tests or SVG parser :(
  • 34. Fabric use cases mouse-based interactions built in Collages might be overkill for static charts Basic games Charts Basic drawing (paintbrush, diagrams) Display SVG where unsupported (Android)
  • 35. What can you build? mustachified.com
  • 36. Future plans Smaller footprint Better docs, tutorials Custom builder fabric-to-SVG Touch compatible (iOS)
  • 37. Smaller footprint Fabric 0.2.5 jQuery 1.6.1 102 KB — minified 91 KB — minified 33 KB — minified + compressed 32 KB — minified + compressed Can do even better – optional json2.js, cufon.js + custom builder
  • 38. Smaller footprint with Cufon without cufon.js 102 KB — minified 86 KB — minified 33 KB — minified + compressed 29 KB — minified + compressed without json2.js JSON missing in FF 3, SF 3.2, OP 10.1, IE 7 82 KB — minified 25 KB — minified + compressed
  • 39. Docs, Tests 1000+ tests ATM http://kangax.github.com/fabric.js/docs http://kangax.github.com/fabric.js/test/unit/suite_runner
  • 40. Demos, Benchmarks http://kangax.github.com/fabric.js/test/ raphael_vs_fabric/complex_shape http://kangax.github.com/fabric.js/demos
  • 41. Supported browsers Firefox 2+ Safari 3+ (& Mobile Safari) Opera 9.64+ Chrome (all versions should work) IE9+ (IE7 & 8 via excanvas.js)
  • 42. Thank you! Questions? http://spkr8.com/t/7582 github.com/kangax/fabric.js @fabric.js @kangax