• 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/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 Canvas 020

    Testing createImageFromXXX functionality

  • §

    Run code

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

    Scene setup

    Get a handle to the Canvas wrappers

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

    Namespacing boilerplate

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

    Create gradients

    scrawl.makeGradient({
    
        name: name('linear1'),
        endX: '100%',
        colors: [
            [0, 'pink'],
            [999, 'darkgreen']
        ],
    
    }).clone({
    
        name: name('linear2'),
        colors: [
            [0, 'darkblue'],
            [999, 'white']
        ],
    
    }).clone({
    
        name: name('linear3'),
        colors: [
            [0, 'yellow'],
            [999, 'purple']
        ],
    
    }).clone({
    
        name: name('linear4'),
        colors: [
            [0, 'black'],
            [999, 'coral']
        ],
    });
  • §

    Create entitys

    const block1 = scrawl.makeBlock({
    
        name: name('b1'),
        group: canvas.base.name,
    
        width: '70%',
        height: '70%',
        startX: '5%',
        startY: '5%',
    
        fillStyle: name('linear1'),
        lockFillStyleToEntity: true,
        strokeStyle: 'coral',
        lineWidth: 4,
        method: 'fillThenDraw',
    });
    
    const block2 = block1.clone({
    
        name: name('b2'),
        startX: '70%',
        startY: '65%',
        handleX: 'center',
        handleY: 'center',
        scale: 0.5,
        fillStyle: name('linear2'),
        strokeStyle: 'red',
    
        delta: {
            roll: -0.5
        },
        order: 1,
    });
    
    const wheel1 = scrawl.makeWheel({
    
        name: name('w1'),
        group: canvas.base.name,
    
        radius: '15%',
        startX: '80%',
        startY: '30%',
        handleX: 'center',
        handleY: 'center',
        fillStyle: name('linear3'),
        lockFillStyleToEntity: true,
        strokeStyle: 'orange',
        lineWidth: 4,
        method: 'fillThenDraw',
    });
    
    const wheel2 = wheel1.clone({
    
        name: name('w2'),
        startX: '30%',
        startY: '60%',
        handleX: '-10%',
        handleY: 'center',
        scale: 0.7,
        fillStyle: name('linear4'),
        strokeStyle: 'lightblue',
    
        delta: {
            roll: 1
        },
        order: 1,
    });
    
    scrawl.makeWheel({
    
        name: name('template'),
        start: ['5%', '35%'],
        radius: 70,
        method: 'none',
        scale: 1.8,
    });
    
    const words = scrawl.makeEnhancedLabel({
    
        name: name('words'),
        group: canvas.base.name,
    
        layoutTemplate: name('template'),
        text: 'Lorem ipsum dolorsit amet',
        fontString: 'bold 26px sans-serif',
        justifyLine: 'left',
        fillStyle: name('linear3'),
        textHandleY: 'center',
        lineSpacing: 1.2,
        lineAdjustment: 20,
        lockFillStyleToEntity: true,
        shadowOffsetX: 1.5,
        shadowOffsetY: 1.5,
    });
  • §

    Create the filter

    scrawl.makeFilter({
    
        name: name('myfilter'),
        method: 'red',
    });
  • §

    Create a new group with an entity that will only be caught in the Cell’s filter

    scrawl.makeGroup({
    
        name: name('temp-group'),
        host: canvas.base.name
    });
    
    scrawl.makeBlock({
    
        name: name('temp-block'),
        group: name('temp-group'),
    
        start: [50,50],
        dimensions: [40, 40],
        fillStyle: 'red',
    });
  • §

    Functionality to capture cell, group and entity images

    let captureImages = false;
    
    const imageCapture = function () {
    
        if (captureImages) {
    
            scrawl.createImageFromCell(canvas, true);
            scrawl.createImageFromGroup(canvas, true);
            scrawl.createImageFromEntity(block1, true);
            scrawl.createImageFromEntity(block2, true);
            scrawl.createImageFromEntity(wheel1, true);
            scrawl.createImageFromEntity(wheel2, true);
            scrawl.createImageFromEntity(words, true);
    
            captureImages = false;
        }
    };
  • §

    Add Picture entitys to the hold canvas, using the assets we will create from the main canvas

    scrawl.makePicture({
    
        name: name('cell-image'),
        group: hold.get('baseGroup'),
    
        width: '13%',
        height: '76%',
    
        startX: '1%',
        startY: '2%',
    
        asset: 'mycanvas_base-image',
        copyWidth: '100%',
        copyHeight: '100%',
    
        lineWidth: 2,
        lineDash: [6, 4],
        strokeStyle: 'red',
    
        method: 'drawThenFill',
    
    }).clone({
    
        name: name('group-image'),
        asset: 'mycanvas_base-groupimage',
        startX: '15%',
    
    }).clone({
    
        name: name('b1-image'),
        asset: name('b1-image'),
        startX: '29%',
    
    }).clone({
    
        name: name('b2-image'),
        asset: name('b2-image'),
        startX: '43%',
    
    }).clone({
    
        name: name('w1-image'),
        asset: name('w1-image'),
        startX: '57%',
    
    }).clone({
    
        name: name('w2-image'),
        asset: name('w2-image'),
        startX: '71%',
    
    }).clone({
    
        name: name('words-image'),
        asset: name('words-image'),
        startX: '85%',
    });
  • §

    Give the hold Picture entitys some labels

    scrawl.makeLabel({
    
        name: name('cell-label'),
        group: hold.get('baseGroup'),
    
        text: 'Cell',
        fontString: '15px sans-serif',
    
        startY: '85%',
        pivot: name('cell-image'),
        lockXTo: 'pivot',
    
    }).clone({
    
        name: name('group-label'),
        text: 'Group',
        pivot: name('group-image'),
    
    }).clone({
    
        name: name('b1-label'),
        text: 'Block1',
        pivot: name('b1-image'),
    
    }).clone({
    
        name: name('b2-label'),
        text: 'Block2',
        pivot: name('b2-image'),
    
    }).clone({
    
        name: name('w1-label'),
        text: 'Wheel1',
        pivot: name('w1-image'),
    
    }).clone({
    
        name: name('w2-label'),
        text: 'Wheel2',
        pivot: name('w2-image'),
    
    }).clone({
    
        name: name('words-label'),
        text: 'Words',
        pivot: name('words-image'),
    });
  • §

    Scene animation

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

    const report = reportSpeed('#reportmessage');
  • §

    Create the Display cycle animation - note that the render is not targeted, thus will run document-wide to act on both <canvas> elements

    scrawl.makeRender({
    
        name: name('animation'),
  • §

    The Display cycle needs to run once before the entitys, Group and Cell are ready to have their images captured

        afterCreated: () => captureImages = true,
    
        commence: imageCapture,
        afterShow: report,
    });
  • §

    User interaction

    Event listeners

    const events = function () {
    
        const base = canvas.base,
            group = base.get('group');
    
        let currentTarget;
    
        return function (e) {
    
            e.preventDefault();
            e.returnValue = false;
    
            const val = e.target.value;
    
            if (val !== currentTarget) {
    
                currentTarget = val;
    
                base.clearFilters();
                group.clearFilters();
                group.clearFiltersFromEntitys();
    
                switch (currentTarget) {
    
                    case 'block1' :
                        block1.addFilters(name('myfilter'));
                        break;
    
                    case 'block2' :
                        block2.addFilters(name('myfilter'));
                        break;
    
                    case 'wheel1' :
                        wheel1.addFilters(name('myfilter'));
                        break;
    
                    case 'wheel2' :
                        wheel2.addFilters(name('myfilter'));
                        break;
    
                    case 'words' :
                        words.addFilters(name('myfilter'));
                        break;
    
                    case 'group' :
                        group.addFilters(name('myfilter'));
                        break;
    
                    case 'cell' :
                        base.addFilters(name('myfilter'));
                        break;
                }
    
                captureImages = true;
            }
        };
    }();
    scrawl.addNativeListener(['input'], events, '.controlItem');
  • §

    Set the DOM input values

    scrawl.initializeDomInputs([
        ['select', 'target', 0],
    ]);
  • §

    Development and testing

    console.log(scrawl.library);