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

    Using getCellData, paintCellData functionality

  • §

    Run code

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

    Scene setup

    Get a handle to the Canvas wrapper

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

    Get a handle to the DOM current status element

    const currentStatus = document.querySelector('#current-status');
    
    const [width, height] = canvas.get('dimensions');
  • §

    Namespacing boilerplate

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

    Create a Cell whose pixels we can directly manipulate

    const easel = canvas.buildCell({
        name: name('easel'),
        dimensions: ['100%', '100%'],
        cleared: false,
        compiled: false,
    });
  • §

    Pixel data manipulation functions

    const clamp = val => {
    
        if (val < 0) return 0;
        if (val > 255) return 255;
        return val;
    };
    
    const setTowardsRed = () => {
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
    
            red++;
            green--;
            blue--;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const setTowardsGreen = () => {
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
    
            red--;
            green++;
            blue--;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const setTowardsBlue = () => {
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
    
            red--;
            green--;
            blue++;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const setTowardsBlack = () => {
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
    
            red--;
            green--;
            blue--;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const setTowardsWhite = () => {
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
    
            red++;
            green++;
            blue++;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const redBlueAxes = () => {
    
        pixelState.forEach(pixel => {
    
            const { row, col } = pixel;
            let { red, green, blue } = pixel;
    
            const redAmount = Math.floor((row / height) * 255),
                greenAmount = 127,
                blueAmount = Math.floor((col / width) * 255);
    
            if (red > redAmount) red--;
            else red++;
    
            if (green > greenAmount) green--;
            else green++;
    
            if (blue > blueAmount) blue--;
            else blue++;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const blueGreenAxes = () => {
    
        pixelState.forEach(pixel => {
    
            const { row, col } = pixel;
            let { red, green, blue } = pixel;
    
            const redAmount = 127,
                greenAmount = Math.floor((col / width) * 255),
                blueAmount = Math.floor((row / height) * 255);
    
            if (red > redAmount) red--;
            else red++;
    
            if (green > greenAmount) green--;
            else green++;
    
            if (blue > blueAmount) blue--;
            else blue++;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const greenRedAxes = () => {
    
        pixelState.forEach(pixel => {
    
            const { row, col } = pixel;
            let { red, green, blue } = pixel;
    
            const redAmount = Math.floor((col / width) * 255),
                greenAmount = Math.floor((row / height) * 255),
                blueAmount = 127;
    
            if (red > redAmount) red--;
            else red++;
    
            if (green > greenAmount) green--;
            else green++;
    
            if (blue > blueAmount) blue--;
            else blue++;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
      update();
    };
    
    const distancesOne = () => {
    
        pixelState.forEach(pixel => {
    
            const distance = pixel.distance;
            let { red, green, blue } = pixel;
    
            const redDistance = 100,
                greenDistance = 250,
                blueDistance = 400;
    
            if (distance > redDistance) red--;
            else red++;
    
            if (distance > greenDistance) green--;
            else green++;
    
            if (distance > blueDistance) blue--;
            else blue++;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const distancesTwo = () => {
    
        pixelState.forEach(pixel => {
    
            const distance = pixel.distance;
            let { red, green, blue } = pixel;
    
            const redDistance = 440,
                greenDistance = 120,
                blueDistance = 270;
    
            if (distance > redDistance) red--;
            else red++;
    
            if (distance > greenDistance) green--;
            else green++;
    
            if (distance > blueDistance) blue--;
            else blue++;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const distancesThree = () => {
    
        pixelState.forEach(pixel => {
    
            const distance = pixel.distance;
            let { red, green, blue } = pixel;
    
            const redDistance = 230,
                greenDistance = 380,
                blueDistance = 80;
    
            if (distance > redDistance) red--;
            else red++;
    
            if (distance > greenDistance) green--;
            else green++;
    
            if (distance > blueDistance) blue--;
            else blue++;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const yellowStripes = () => {
    
        const stripeWidth = width / 5;
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
    
            const stripeVal = Math.floor(pixel.col / stripeWidth) * 50;
    
            if (red > stripeVal) red--;
            else red++;
    
            if (green > stripeVal) green--;
            else green++;
    
            blue--;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const cyanStripes = () => {
    
        const stripeHeight = height / 5;
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
    
            const stripeVal = Math.floor(pixel.row / stripeHeight) * 50;
    
            if (green > stripeVal) green--;
            else green++;
    
            if (blue > stripeVal) blue--;
            else blue++;
    
            red--;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const fizzBang = () => {
    
        pixelState.forEach(pixel => {
    
            const { row, col } = pixel;
            let { red, green, blue } = pixel;
    
            if (row % 3 === 0) {
                red++;
            }
            if (row % 5 === 0) {
                green++;
            }
            if (row % 11 === 0 ) {
                blue++;
            }
            if (col % 3 === 0) {
                red--;
            }
            if (col % 5 === 0) {
                green--;
            }
            if (col % 11 === 0 ) {
                blue--;
            }
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const thinStripe = () => {
    
        pixelState.forEach(pixel => {
    
            const { row, col } = pixel;
            let { red, green, blue } = pixel;
    
            if (row % 3 === col % 3) {
                red++;
            }
            if (row % 5 === col % 5) {
                green++;
            }
            if (row % 11 === col % 11 ) {
                blue++;
            }
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const thinStripeReverse = () => {
    
        pixelState.forEach(pixel => {
    
            const { row, col } = pixel;
            let { red, green, blue } = pixel;
    
            if ((width - row) % 3 === col % 3) {
                red++;
            }
            if ((width - row) % 5 === col % 5) {
                green++;
            }
            if ((width - row) % 11 === col % 11 ) {
                blue++;
            }
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const circlesGradient = () => {
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
    
            const d = (pixel.distance * 5) % 255;
    
            if (red > d) red--;
            else red++;
    
            if (green > d) green--;
            else green++;
    
            if (blue > d) blue--;
            else blue++;
    
            pixel.red = clamp(red);
            pixel.green = clamp(green);
            pixel.blue = clamp(blue);
        });
        update();
    };
    
    const conicOne = () => {
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
            const angle = pixel.angle;
    
            if (angle < 0.33) {
    
                if (red < 255) red++;
            }
            else if (angle < 0.67) {
    
                if (green < 255) green++;
            }
            else {
    
                if (blue < 255) blue++;
            }
    
            pixel.red = red;
            pixel.green = green;
            pixel.blue = blue;
        });
        update();
    };
    
    const conicTwo = () => {
    
        pixelState.forEach(pixel => {
    
            let { red, green, blue } = pixel;
            const angle = pixel.angle;
    
            if (angle < 0.33) {
    
                if (red > 0) red--;
            }
            else if (angle < 0.67) {
    
                if (green > 0) green--;
            }
            else {
    
                if (blue > 0) blue--;
            }
    
            pixel.red = red;
            pixel.green = green;
            pixel.blue = blue;
        });
        update();
    };
  • §

    Scene animation

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

    const report = reportSpeed('#reportmessage');
    
    const easelData = easel.getCellData(true),
        pixelState = easelData.pixelState;
    
    const update = () => easel.paintCellData(easelData);
    
    update();
  • §

    Create the Display cycle animation

    const render = scrawl.makeRender({
    
        name: name('animation'),
        target: canvas,
        afterShow: report,
    });
  • §

    Update to a new pixel manipulation function every 2.5 seconds

    const updateOptions = [
        setTowardsBlack,
        setTowardsWhite,
        redBlueAxes,
        blueGreenAxes,
        greenRedAxes,
        setTowardsRed,
        setTowardsGreen,
        setTowardsBlue,
        distancesOne,
        distancesTwo,
        distancesThree,
        yellowStripes,
        cyanStripes,
        fizzBang,
        thinStripe,
        circlesGradient,
        thinStripeReverse,
        conicOne,
        conicTwo,
    ];
    
    const optionNames = [
        'setTowardsBlack',
        'setTowardsWhite',
        'redBlueAxes',
        'blueGreenAxes',
        'greenRedAxes',
        'setTowardsRed',
        'setTowardsGreen',
        'setTowardsBlue',
        'distancesOne',
        'distancesTwo',
        'distancesThree',
        'yellowStripes',
        'cyanStripes',
        'fizzBang',
        'thinStripe',
        'circlesGradient',
        'thinStripeReverse',
        'conicOne',
        'conicTwo',
    ];
    
    const len = updateOptions.length,
        rnd = scrawl.seededRandomNumberGenerator('salting-is-good');
    
    let choice = rnd.range(len),
        currentChoice = choice;
    
    render.set({ commence: updateOptions[currentChoice] });
    currentStatus.textContent = `Starting with ${optionNames[currentChoice]}`;
    
    setInterval(() => {
    
        choice = rnd.range(len);
        render.set({ commence: updateOptions[choice] });
        currentStatus.textContent = `Changing from ${optionNames[currentChoice]} to ${optionNames[choice]}`;
        currentChoice = choice;
    }, 2500);
  • §

    Development and testing

    console.log(scrawl.library);