• 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 034

    Determine the displayed shape of the visible canvas; react to changes in the displayed shape

  • ¶

    Run code

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

    Scene setup

    const canvas = scrawl.library.canvas.mycanvas;
    
    canvas.set({
    
        isComponent: true,
        checkForResize: true,
    
    }).setAsCurrentCanvas();
  • ¶

    Create the demo Phrase entity

    const mytext = scrawl.makePhrase({
    
        name: 'display-shape-text',
    
        start: ['center', 'center'],
        handle: ['center', 'center'],
    
        text: `Canvas display shape: undetermined`,
        size: '40px',
        justify: 'center',
    
        fillStyle: 'black',
    });
  • ¶

    Scrawl-canvas recognises five shapes, separated by four breakpoints:

    • banner
    • landscape
    • rectangle
    • portrait
    • skyscraper

    The values assigned to the breakpoints are Float numbers for the displayed Canvas element’s width/height ratio - the value 3 represents the case where the width value is three times more than the height value, while 0.35 represents a width (roughly) 3 times less than the height.

    We can set a Canvas artefact’s breakpoints in one go using the dedicated setDisplayShapeBreakpoints() function, as below. Alternatively we can use the regular set() function, supplying the attributes breakToBanner, breakToLandscape, breakToPortrait and breakToSkyscraper as required. The values given here are the default values for Canvas artefacts.

    Similar functionality exists to adjust to the current (base) Cell area (width * height)

    canvas.setDisplayShapeBreakpoints({
    
        breakToBanner: 3,
        breakToLandscape: 1.5,
        breakToPortrait: 0.65,
        breakToSkyscraper: 0.35,
    
        breakToSmallest: 100000,
        breakToSmaller: 150000,
        breakToLarger: 200000,
        breakToLargest: 300000,
    });
  • ¶

    Each display shape has an associated hook function (by default a function that does nothing) which Scrawl-canvas will run each time it detects that the Canvas display shape has changed to that shape. We can replace these null-functions with our own; this allows us to configure the scene/animation to accommodate different display shapes, thus making the code reusable in a range of different web page environments.

    We can set/update these functions at any time using the normal set() function:

    canvas.set({
    
        actionBannerShape: () => {
            mytext.set({
                text: `Canvas display shape: ${canvas.get('displayShape')}`,
                roll: 0,
            });
        },
    
        actionRectangleShape: () => {
            mytext.set({
                text: `Canvas display shape: ${canvas.get('displayShape')}`,
                roll: -45,
            });
        },
    
        actionSkyscraperShape: () => {
            mytext.set({
                text: `Canvas display shape: ${canvas.get('displayShape')}`,
                roll: -90,
            });
        },
    
        actionLargestArea: () => {
            mytext.set({
                size: '40px',
            });
        },
    
        actionRegularArea: () => {
            mytext.set({
                size: '28px',
            });
        },
    
        actionSmallestArea: () => {
            mytext.set({
                size: '16px',
            });
        },
    });
  • ¶

    We can also set/update the functions using dedicated setAction???Shape() functions:

    canvas.setActionPortraitShape(() => {
        mytext.set({
            text: `Canvas display shape: ${canvas.get('displayShape')}`,
            roll: -67.5,
        });
    });
    
    canvas.setActionLandscapeShape(() => {
        mytext.set({
            text: `Canvas display shape: ${canvas.get('displayShape')}`,
            roll: -22.5,
        });
    });
    
    canvas.setActionLargerArea(() => {
        mytext.set({
            size: '34px',
        });
    });
    
    canvas.setActionSmallerArea(() => {
        mytext.set({
            size: '22px',
        });
    });
  • ¶

    Scene animation

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

    let 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

    const demoAnimation = scrawl.makeRender({
    
        name: "demo-animation",
        target: canvas,
        afterShow: report,
  • ¶

    We manually trigger the display shape functionality after the first render cycle completes. This allows all artefacts to settle into a state where we can then update the Phrase entity with text and roll values appropriate to the Canvas element’s initial shape

        afterCreated: () => canvas.updateDisplay(),
    });
  • ¶

    Development and testing

    console.log(scrawl.library);