• Jump To … +
    ./demo/canvas-001.js ./demo/canvas-002.js ./demo/canvas-003.js ./demo/canvas-004.js ./demo/canvas-005.js ./demo/canvas-006.js ./demo/canvas-007.js ./demo/canvas-008.js ./demo/canvas-009.js ./demo/canvas-010.js ./demo/canvas-011.js ./demo/canvas-012.js ./demo/canvas-013.js ./demo/canvas-014.js ./demo/canvas-015.js ./demo/canvas-016.js ./demo/canvas-017.js ./demo/canvas-018.js ./demo/canvas-019.js ./demo/canvas-020.js ./demo/canvas-021.js ./demo/canvas-022.js ./demo/canvas-023.js ./demo/canvas-024.js ./demo/canvas-025.js ./demo/canvas-026.js ./demo/canvas-027.js ./demo/canvas-028.js ./demo/canvas-029.js ./demo/canvas-030.js ./demo/canvas-031.js ./demo/canvas-032.js ./demo/canvas-033.js ./demo/canvas-034.js ./demo/canvas-035.js ./demo/canvas-036.js ./demo/canvas-037.js ./demo/canvas-038.js ./demo/canvas-039.js ./demo/canvas-040.js ./demo/canvas-041.js ./demo/canvas-042.js ./demo/canvas-043.js ./demo/canvas-044.js ./demo/canvas-045.js ./demo/canvas-046.js ./demo/canvas-047.js ./demo/component-001.js ./demo/component-002.js ./demo/component-003.js ./demo/component-004.js ./demo/component-005.js ./demo/component-006.js ./demo/component-007.js ./demo/core-001.js ./demo/dom-001.js ./demo/dom-002.js ./demo/dom-003.js ./demo/dom-004.js ./demo/dom-005.js ./demo/dom-006.js ./demo/dom-007.js ./demo/dom-008.js ./demo/dom-009.js ./demo/dom-010.js ./demo/dom-011.js ./demo/dom-012.js ./demo/dom-013.js ./demo/dom-014a.js ./demo/dom-014b.js ./demo/dom-014c.js ./demo/dom-015.js ./demo/dom-016.js ./demo/filters-001.js ./demo/filters-002.js ./demo/filters-003.js ./demo/filters-004.js ./demo/filters-005.js ./demo/filters-006.js ./demo/filters-007.js ./demo/filters-008.js ./demo/filters-009.js ./demo/filters-010.js ./demo/filters-011.js ./demo/filters-012.js ./demo/filters-013.js ./demo/filters-014.js ./demo/filters-015.js ./demo/filters-016.js ./demo/filters-017.js ./demo/filters-018.js ./demo/filters-019.js ./demo/filters-020.js ./demo/filters-501.js ./demo/filters-502.js ./demo/filters-503.js ./demo/filters-504.js ./demo/filters-505.js ./demo/particles-001.js ./demo/particles-002.js ./demo/particles-003.js ./demo/particles-004.js ./demo/particles-005.js ./demo/particles-006.js ./demo/particles-007.js ./demo/particles-008.js ./demo/particles-009.js ./demo/particles-010.js ./demo/particles-011.js ./demo/particles-012.js ./demo/particles-013.js ./demo/particles-014.js ./demo/particles-015.js ./demo/particles-016.js ./demo/temp-001.js ./demo/temp-inkscapeSvgFilters.js
  • ¶

    Demo Canvas 041

    Access and use a canvas context engine using the makeAnimation factory

  • ¶

    Run code

    import scrawl from '../source/scrawl.js';
  • ¶

    Scene setup

    const canvas = scrawl.library.canvas.mycanvas;
    
    canvas.setBase({
        backgroundColor: 'aliceblue',
    });
  • ¶

    Create a function to draw stuff on a canvas

    • Code taken from this blog site post: Bartosz Ciechanowski - Cameras and lenses, 7 December 2020 … specifically this JS file
    const drawBlade = function (engine, rotation = 0) {
    
        engine.save();
    
        engine.translate(200, 200);
        engine.rotate(rotation * Math.PI / 180);
        engine.translate(-200, -200);
    
        engine.translate(71, 25);
    
        engine.fillStyle = "#111";
        engine.strokeStyle = "#777";
    
        engine.beginPath();
        engine.moveTo(89.4010224, 104.878569);
        engine.bezierCurveTo(89.2014641, 59.0393448, 52.2406566, 21.8785692, 6.40102238, 21.8785692);
        engine.bezierCurveTo(-0.598977616, 21.8785692, -3.54240333, 14.8213764, 6.40102238, 10.3785692);
        engine.bezierCurveTo(29.9010224, -0.121430803, 60.1944849, -2.5577938, 85.1944849, 4.4422062);
        engine.bezierCurveTo(106.455278, 10.3952284, 130.17673, 17.6283113, 144.389943, 43.5465243);
        engine.bezierCurveTo(161.389943, 74.5465243, 150.901934, 94.6590605, 155.901022, 116.878569);
        engine.bezierCurveTo(162.227448, 144.997707, 171.289513, 153.053505, 176.736821, 156.416713);
        engine.bezierCurveTo(183.731851, 160.735498, 184.243043, 167.938877, 181.743043, 172.438877);
        engine.bezierCurveTo(179.243043, 176.938877, 173.80372, 180.55601, 166.350116, 177.644439);
        engine.bezierCurveTo(157.688987, 174.261179, 122.055011, 166.31114, 109.41407, 154.260969);
        engine.bezierCurveTo(103.684297, 148.798975, 89.5544242, 140.115494, 89.4010224, 104.878569);
        engine.closePath();
        engine.fill("evenodd");
        engine.stroke();
    
        engine.fillStyle = "#333";
        engine.strokeStyle = "#777";
        engine.beginPath();
        engine.arc(171, 166, 4, 0, 6.283185307179586, false);
        engine.closePath();
        engine.fill("evenodd");
        engine.stroke();
        engine.restore();
    };
  • ¶

    Scene animation

  • ¶

    Function to display frames-per-second data, and other information relevant to the demo

    const report = function () {
    
        let testTicker = Date.now(),
            testTime, testNow,
            testMessage = document.querySelector('#reportmessage');
    
        return function () {
    
            testNow = Date.now();
            testTime = testNow - testTicker;
            testTicker = testNow;
    
            testMessage.textContent = `Screen refresh: ${Math.ceil(testTime)}ms; fps: ${Math.floor(1000 / testTime)}`;
        };
    }();
  • ¶

    Create the Display cycle animation

    • We can use makeAnimation instead of makeRender
    • In the fn function, we need to return a Promise
    • Inside the Promise, we construct our Display cycle, which is a promise-based chain of functions
    let rotation = 0;
    
    scrawl.makeAnimation({
  • ¶

    Give our animation a name, in case we want to retrieve it from te Scrawl-canvas library later

        name: "demo-animation",
  • ¶

    Every Animation object must have a fn attribute!

        fn: () => {
    
            return new Promise((resolve, reject) => {
  • ¶

    The Display cycle includes 3 key steps:

    • clear() - to wipe the canvas’s drawing areas clean
    • compile() - which takes place on the Canvas wrapper object’s base canvas.
    • show() - which copies over everything drawn on the base canvas and pastes it into the display canvas
                Promise.resolve(canvas.clear())
  • ¶

    In this instance, we’re using our drawBlade() function instead of the built-in compile function

                .then(() => Promise.resolve(drawBlade(canvas.base.engine, ++rotation)))
    
                .then(() => canvas.show())
  • ¶

    We can invoke additional functions at any time, wrapping them in Promise.resolve() functions

                .then(() => Promise.resolve(report()))
  • ¶

    Always resolve the Display cycle!

                .then(() => resolve(true))
  • ¶

    Always catch errors - if something goes wrong the Promise chain needs to reject, not resolve

                .catch(err => reject(err));
            });
        },
    });
  • ¶

    Development and testing

    console.log(scrawl.library);