• 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/canvas-048.js ./demo/canvas-049.js ./demo/canvas-050.js ./demo/canvas-051.js ./demo/canvas-052.js ./demo/canvas-053.js ./demo/canvas-054.js ./demo/canvas-055.js ./demo/canvas-056.js ./demo/canvas-057.js ./demo/canvas-058.js ./demo/canvas-059.js ./demo/canvas-060.js ./demo/canvas-061.js ./demo/canvas-062.js ./demo/canvas-063.js ./demo/canvas-064.js ./demo/canvas-065.js ./demo/canvas-066.js ./demo/canvas-067.js ./demo/canvas-068.js ./demo/canvas-069.js ./demo/canvas-070.js ./demo/canvas-071.js ./demo/canvas-072.js ./demo/canvas-073.js ./demo/canvas-074.js ./demo/canvas-201.js ./demo/canvas-202.js ./demo/canvas-203.js ./demo/canvas-204.js ./demo/canvas-205.js ./demo/canvas-206.js ./demo/canvas-207.js ./demo/canvas-208.js ./demo/canvas-209.js ./demo/canvas-210.js ./demo/canvas-211.js ./demo/canvas-212.js ./demo/delaunator-001.js ./demo/delaunator-002.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-015.js ./demo/dom-016.js ./demo/dom-017.js ./demo/dom-018.js ./demo/dom-019.js ./demo/dom-020.js ./demo/dom-021.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-021.js ./demo/filters-022.js ./demo/filters-023.js ./demo/filters-024.js ./demo/filters-025.js ./demo/filters-026.js ./demo/filters-027.js ./demo/filters-028.js ./demo/filters-029.js ./demo/filters-030.js ./demo/filters-031.js ./demo/filters-032.js ./demo/filters-033.js ./demo/filters-034.js ./demo/filters-035.js ./demo/filters-036.js ./demo/filters-037.js ./demo/filters-038.js ./demo/filters-039.js ./demo/filters-040.js ./demo/filters-041.js ./demo/filters-101.js ./demo/filters-102.js ./demo/filters-103.js ./demo/filters-104.js ./demo/filters-105.js ./demo/filters-501.js ./demo/filters-502.js ./demo/filters-503.js ./demo/filters-504.js ./demo/filters-505.js ./demo/mediapipe-001.js ./demo/mediapipe-002.js ./demo/mediapipe-003.js ./demo/modules-001.js ./demo/modules-002.js ./demo/modules-003.js ./demo/modules-004.js ./demo/modules-005.js ./demo/modules-006.js ./demo/packets-001.js ./demo/packets-002.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/particles-017.js ./demo/snippets-001.js ./demo/snippets-002.js ./demo/snippets-003.js ./demo/snippets-004.js ./demo/snippets-005.js ./demo/snippets-006.js ./demo/temp-001.js ./demo/temp-shape-scale-investigation.js ./demo/tensorflow-001.js ./demo/tensorflow-002.js ./demo/utilities.js
  • §

    Demo Packets 001

    Save and load Scrawl-canvas entity using text packets

  • §

    Run code

    import * as scrawl from '../source/scrawl.js';
    
    import { reportSpeed } from './utilities.js';
  • §

    Scene setup

    const canvas = scrawl.findCanvas('mycanvas');
  • §

    Namespacing boilerplate

    const namespace = canvas.name;
    const name = (n) => `${namespace}-${n}`;
  • §

    Event listeners

    scrawl.addListener('move', () => canvas.cascadeEventAction('move'), canvas.domElement);
    scrawl.addListener('up', () => canvas.cascadeEventAction('up'), canvas.domElement);
  • §

    Testing Block entity

    const box = scrawl.makeBlock({
    
        name: name('my-box'),
    
        startX: 10,
        startY: 10,
    
        width: 100,
        height: 50,
    
        fillStyle: 'red',
    
        onEnter: function () {
    /** @ts-expect-error */
            this.set({
                fillStyle: 'pink',
            });
        },
    
        onLeave: function () {
    /** @ts-expect-error */
            this.set({
                fillStyle: 'red',
            });
        },
    
    /** @ts-expect-error */
        onUp: function () { this.clickAnchor() },
    
        anchor: {
            name: 'wikipedia-box-link',
            href: 'https://en.wikipedia.org/wiki/Box',
            description: 'Link to the Wikipedia article on boxes (opens in new tab)',
    
            clickAction: function () { return `console.log('box clicked')` },
        },
    });
  • §
    Test 1 - no argument supplied
    
    const boxPacket1 = box.saveAsPacket();
  • §
    Test 2 - argument === true
    
    const boxPacket2 = box.saveAsPacket(true);
  • §
    Test 3 - argument.includeDefaults === true
    
    const boxPacket3 = box.saveAsPacket({
        includeDefaults: true,
    });
  • §
    Test 4 - argument.includeDefaults === Array
    
    const boxPacket4 = box.saveAsPacket({
        includeDefaults: ['handle', 'miterLimit', 'onUp', 'useMimicScale', 'anchor', 'delta', 'filter', 'filters'],
    });
    
    console.log('Save test 1 result: ', boxPacket1);
    console.log('Save test 2 result: ', boxPacket2);
    console.log('Save test 3 result: ', boxPacket3);
    console.log('Save test 4 result: ', boxPacket4);
  • §

    saveAsPacket expected results:

    • Save test 1 result: [“mycanvas-my-box”,”Block”,”entity”,{“name”:”mycanvas-my-box”,”dimensions”:[100,50],”start”:[10,10],”onEnter”:”~~~\n/** @ts-expect-error /\n this.set({\n fillStyle: ‘pink’,\n });\n “,”onLeave”:”~~~\n/* @ts-expect-error */\n this.set({\n fillStyle: ‘red’,\n });\n “,”onUp”:”~~~ this.clickAnchor() “,”anchor”:{“name”:”wikipedia-box-link”,”description”:”Link to the Wikipedia article on boxes (opens in new tab)”,”href”:”https://en.wikipedia.org/wiki/Box","host":"mycanvas-my-box","clickAction":"~~~ return console.log('box clicked') “},”group”:”mycanvas_base”,”fillStyle”:”red”}] packets-001.js:78:9
    • Save test 2 result: [“mycanvas-my-box”,”Block”,”entity”,{“name”:”mycanvas-my-box”,”dimensions”:[100,50],”start”:[10,10],”handle”:[0,0],”offset”:[0,0],”delta”:{},”deltaConstraints”:{},”lockTo”:[“start”,”start”],”pivot”:””,”mimic”:””,”filters”:[],”visibility”:true,”calculateOrder”:0,”stampOrder”:0,”bringToFrontOnDrag”:true,”ignoreDragForX”:false,”ignoreDragForY”:false,”scale”:1,”roll”:0,”noUserInteraction”:false,”noPositionDependencies”:false,”noCanvasEngineUpdates”:false,”noFilters”:false,”noPathUpdates”:false,”noDeltaUpdates”:false,”checkDeltaConstraints”:false,”performDeltaChecks”:false,”pivotPin”:0,”pivotIndex”:-1,”addPivotHandle”:false,”addPivotOffset”:true,”addPivotRotation”:false,”useMimicDimensions”:false,”useMimicScale”:false,”useMimicStart”:false,”useMimicHandle”:false,”useMimicOffset”:false,”useMimicRotation”:false,”useMimicFlip”:false,”addOwnDimensionsToMimic”:false,”addOwnScaleToMimic”:false,”addOwnStartToMimic”:false,”addOwnHandleToMimic”:false,”addOwnOffsetToMimic”:false,”addOwnRotationToMimic”:false,”path”:””,”pathPosition”:0,”addPathHandle”:false,”addPathOffset”:true,”addPathRotation”:false,”constantSpeedAlongPath”:false,”isStencil”:false,”memoizeFilterOutput”:false,”method”:”fill”,”winding”:”nonzero”,”flipReverse”:false,”flipUpend”:false,”scaleOutline”:true,”scaleShadow”:false,”lockFillStyleToEntity”:false,”lockStrokeStyleToEntity”:false,”onEnter”:”~~~\n/** @ts-expect-error /\n this.set({\n fillStyle: ‘pink’,\n });\n “,”onLeave”:”~~~\n/* @ts-expect-error */\n this.set({\n fillStyle: ‘red’,\n });\n “,”onUp”:”~~~ this.clickAnchor() “,”anchor”:{“name”:”wikipedia-box-link”,”description”:”Link to the Wikipedia article on boxes (opens in new tab)”,”disabled”:false,”tabOrder”:0,”download”:””,”href”:”https://en.wikipedia.org/wiki/Box","hreflang":"","ping":"","referrerpolicy":"","rel":"noreferrer","target":"_blank","anchorType":"","focusAction":true,"blurAction":true,"host":"mycanvas-my-box","clickAction":"~~~ return console.log('box clicked') “},”group”:”mycanvas_base”,”fillStyle”:”red”,”strokeStyle”:”rgb(0 0 0 / 1)”,”globalAlpha”:1,”globalCompositeOperation”:”source-over”,”lineWidth”:1,”lineCap”:”butt”,”lineJoin”:”miter”,”lineDashOffset”:0,”miterLimit”:10,”shadowOffsetX”:0,”shadowOffsetY”:0,”shadowBlur”:0,”shadowColor”:”rgb(0 0 0 / 1)”,”font”:”12px sans-serif”,”direction”:”ltr”,”fontKerning”:”normal”,”textRendering”:”auto”,”letterSpacing”:”0px”,”wordSpacing”:”0px”,”fontStretch”:”normal”,”fontVariantCaps”:”normal”,”filter”:”none”,”imageSmoothingEnabled”:true,”imageSmoothingQuality”:”high”,”textAlign”:”left”,”textBaseline”:”top”,”lineDash”:[]}] packets-001.js:79:9
    • Save test 3 result: [“mycanvas-my-box”,”Block”,”entity”,{“name”:”mycanvas-my-box”,”dimensions”:[100,50],”start”:[10,10],”handle”:[0,0],”offset”:[0,0],”delta”:{},”deltaConstraints”:{},”lockTo”:[“start”,”start”],”pivot”:””,”mimic”:””,”filters”:[],”visibility”:true,”calculateOrder”:0,”stampOrder”:0,”bringToFrontOnDrag”:true,”ignoreDragForX”:false,”ignoreDragForY”:false,”scale”:1,”roll”:0,”noUserInteraction”:false,”noPositionDependencies”:false,”noCanvasEngineUpdates”:false,”noFilters”:false,”noPathUpdates”:false,”noDeltaUpdates”:false,”checkDeltaConstraints”:false,”performDeltaChecks”:false,”pivotPin”:0,”pivotIndex”:-1,”addPivotHandle”:false,”addPivotOffset”:true,”addPivotRotation”:false,”useMimicDimensions”:false,”useMimicScale”:false,”useMimicStart”:false,”useMimicHandle”:false,”useMimicOffset”:false,”useMimicRotation”:false,”useMimicFlip”:false,”addOwnDimensionsToMimic”:false,”addOwnScaleToMimic”:false,”addOwnStartToMimic”:false,”addOwnHandleToMimic”:false,”addOwnOffsetToMimic”:false,”addOwnRotationToMimic”:false,”path”:””,”pathPosition”:0,”addPathHandle”:false,”addPathOffset”:true,”addPathRotation”:false,”constantSpeedAlongPath”:false,”isStencil”:false,”memoizeFilterOutput”:false,”method”:”fill”,”winding”:”nonzero”,”flipReverse”:false,”flipUpend”:false,”scaleOutline”:true,”scaleShadow”:false,”lockFillStyleToEntity”:false,”lockStrokeStyleToEntity”:false,”onEnter”:”~~~\n/** @ts-expect-error /\n this.set({\n fillStyle: ‘pink’,\n });\n “,”onLeave”:”~~~\n/* @ts-expect-error */\n this.set({\n fillStyle: ‘red’,\n });\n “,”onUp”:”~~~ this.clickAnchor() “,”anchor”:{“name”:”wikipedia-box-link”,”description”:”Link to the Wikipedia article on boxes (opens in new tab)”,”disabled”:false,”tabOrder”:0,”download”:””,”href”:”https://en.wikipedia.org/wiki/Box","hreflang":"","ping":"","referrerpolicy":"","rel":"noreferrer","target":"_blank","anchorType":"","focusAction":true,"blurAction":true,"host":"mycanvas-my-box","clickAction":"~~~ return console.log('box clicked') “},”group”:”mycanvas_base”,”fillStyle”:”red”,”strokeStyle”:”rgb(0 0 0 / 1)”,”globalAlpha”:1,”globalCompositeOperation”:”source-over”,”lineWidth”:1,”lineCap”:”butt”,”lineJoin”:”miter”,”lineDashOffset”:0,”miterLimit”:10,”shadowOffsetX”:0,”shadowOffsetY”:0,”shadowBlur”:0,”shadowColor”:”rgb(0 0 0 / 1)”,”font”:”12px sans-serif”,”direction”:”ltr”,”fontKerning”:”normal”,”textRendering”:”auto”,”letterSpacing”:”0px”,”wordSpacing”:”0px”,”fontStretch”:”normal”,”fontVariantCaps”:”normal”,”filter”:”none”,”imageSmoothingEnabled”:true,”imageSmoothingQuality”:”high”,”textAlign”:”left”,”textBaseline”:”top”,”lineDash”:[]}] packets-001.js:80:9
    • Save test 4 result: [“mycanvas-my-box”,”Block”,”entity”,{“name”:”mycanvas-my-box”,”dimensions”:[100,50],”start”:[10,10],”handle”:[0,0],”delta”:{},”filters”:[],”useMimicScale”:false,”onEnter”:”~~~\n/** @ts-expect-error /\n this.set({\n fillStyle: ‘pink’,\n });\n “,”onLeave”:”~~~\n/* @ts-expect-error */\n this.set({\n fillStyle: ‘red’,\n });\n “,”onUp”:”~~~ this.clickAnchor() “,”anchor”:{“name”:”wikipedia-box-link”,”description”:”Link to the Wikipedia article on boxes (opens in new tab)”,”href”:”https://en.wikipedia.org/wiki/Box","host":"mycanvas-my-box","clickAction":"~~~ return console.log('box clicked') “},”group”:”mycanvas_base”,”fillStyle”:”red”,”miterLimit”:10,”filter”:”none”}] packets-001.js:81:9
    
    box.kill();
    console.log('Import test setup - check to see if entity has been deleted', Object.keys(scrawl.library.entity));
  • §

    Kill test expected result:

    • Import test setup - check to see if entity has been deleted
    • Array []
    const importTester = (time = 0, action = false, url = '', label = 'no test name', override) => {
    
        if (action) {
    
            setTimeout(() => {
    
                try {
                    const res = canvas.actionPacket(url, override);
                    console.log('SUCCESS', label, res);
                }
                catch (err) { console.log('ERROR',label, err); }
            }, time);
    
        }
        else {
    
            setTimeout(() => {
    
                canvas.importPacket(url, override)
                .then(res => {
    
                    console.log('SUCCESS', label, res);
                })
                .catch(err => {
    
                    console.log('ERROR',label, err)
                });
            }, time)
        }
    };
    
    const fullOverride = {
        reviveFunctions: true,
        allowDOMElementCreation: true,
    };
    
    const noDomOverride = {
        reviveFunctions: true,
    };
    
    [
        [1000, true, boxPacket1.substring(0, 50), 'Import test 1'],
        [2000, true, boxPacket1, 'Import test 2'],
        [3000, true, boxPacket1, 'Import test 3', fullOverride],
        [4000, true, boxPacket1, 'Import test 4', noDomOverride],
        [5000, false, './packets/packets-001-block', 'Import test 5'],
        [6000, false, './packets/packets-001-block.txt', 'Import test 6'],
        [7000, false, './packets/packets-001-block.txt', 'Import test 7', fullOverride],
        [8000, false, './packets/packets-001-block-updated.txt', 'Import test 8', fullOverride]
    /** @ts-expect-error */
    ].forEach(item => importTester(...item));
  • §

    actionPacket and importPacket Expected results:

    Failed to process packet due to JSON parsing error - JSON.parse: unterminated string at line 1 column 51 of the JSON data base.js:564:53
    SUCCESS Import test 1 Error: Failed to process packet due to JSON parsing error - JSON.parse: unterminated string at line 1 column 51 of the JSON data
        actionPacket http://localhost:3000/source/mixin/base.js:472
        importTester http://localhost:3000/demo/packets-001.js:105
        setTimeout handler*importTester http://localhost:3000/demo/packets-001.js:102
        <anonymous> http://localhost:3000/demo/packets-001.js:137
        <anonymous> http://localhost:3000/demo/packets-001.js:137
    packets-001.js:106:25
    SC packet import skipped function revival for mycanvas-my-box.onEnter base.js:585:33
    SC packet import skipped function revival for mycanvas-my-box.onLeave base.js:585:33
    SC packet import skipped function revival for mycanvas-my-box.onUp base.js:585:33
    SUCCESS Import test 2
    Object { … }
    packets-001.js:106:25
    SUCCESS Import test 3
    Object { … }
    packets-001.js:106:25
    XHR
    GET
    http://localhost:3000/demo/packets/packets-001-block
    [HTTP/1.1 404 Not Found 1ms]
    
    ERROR Import test 4 Error: Packet import from server failed - 404: Not Found - http://localhost:3000/demo/packets/packets-001-block
        getPacket http://localhost:3000/source/mixin/base.js:402
        promise callback*default/P.importPacket/getPacket/< http://localhost:3000/source/mixin/base.js:400
        getPacket http://localhost:3000/source/mixin/base.js:377
        importPacket http://localhost:3000/source/mixin/base.js:429
        importTester http://localhost:3000/demo/packets-001.js:116
        setTimeout handler*importTester http://localhost:3000/demo/packets-001.js:114
        <anonymous> http://localhost:3000/demo/packets-001.js:137
        <anonymous> http://localhost:3000/demo/packets-001.js:137
    packets-001.js:123:25
    SC packet import skipped function revival for mycanvas-my-box.onEnter base.js:585:33
    SC packet import skipped function revival for mycanvas-my-box.onLeave base.js:585:33
    SUCCESS Import test 5
    Object { … }
    packets-001.js:119:25
    SUCCESS Import test 6
    Object { … }
    packets-001.js:119:25
    SUCCESS Import test 7
    Object { … }
    packets-001.js:119:25
    
    
    const report = reportSpeed('#reportmessage');
  • §

    Scene animation

    Create the Display cycle animation

    scrawl.makeRender({
    
        name: name('animation'),
        target: canvas,
        afterShow: report,
    });
    
    console.log(scrawl.library);